資料庫表的索引從資料儲存方式上可以分為聚簇索引和非聚簇索引(又叫二級索引)兩種。innodb的聚簇索引在同乙個b-tree中儲存了索引列和具體的資料,在聚簇索引中,實際的資料儲存在葉子頁中,中間的節點頁儲存指向下一層頁面的指標。「聚簇」的意思是資料行被按照一定順序乙個個緊密地排列在一起儲存。乙個表只能有乙個聚簇索引,因為在乙個表中資料的存放方式只有一種。
一般來說,將通過主鍵作為聚簇索引的索引列,也就是通過主鍵聚集資料。下圖展示了innodb中聚簇索引的結構(來自《高效能mysql(第三版)》):
聚簇索引的結構
這裡要特別注意頁的概念,乙個頁可以理解為一塊具有一定大小的連續的儲存區域。相同頁內的資料行在物理上是相鄰的,因此邏輯上鍵值相鄰的頁在物理上可能相隔很遠。
在中間的某個節點頁中,主鍵<11的葉子頁和11《主鍵<21的葉子頁分別被兩個指標所指向,且主鍵<11的葉子頁也有乙個指標指向了11《主鍵<21的葉子頁,其餘頁之間的關係也是一樣。
聚簇索引將索引和資料行儲存在同乙個b-tree中,查詢通過聚簇索引可以直接獲取資料,相比非聚簇索引需要第二次查詢(非覆蓋索引的情況下)效率要高。
聚簇索引對於範圍查詢的效率很高,因為其資料是按照大小排列的
聚簇索引的更新代價比較高,如果更新了行的聚簇索引列,就需要將資料移動到相應的位置。這可能因為要插入的頁已滿而導致「頁**」。
插入速度嚴重依賴於插入順序,按照主鍵進行插入的速度是載入資料到innodb中的最快方式。如果不是按照主鍵插入,最好在載入完成後使用optimize table命令重新組織一下表。
聚簇索引在插入新行和更新主鍵時,可能導致「頁**」問題。
聚簇索引可能導致全表掃瞄速度變慢,因為可能需要載入物理上相隔較遠的頁到記憶體中(需要耗時的磁碟尋道操作)。
非聚簇索引,又叫二級索引。二級索引的葉子節點中儲存的不是指向行的物理指標,而是行的主鍵值。當通過二級索引查詢行,儲存引擎需要在二級索引中找到相應的葉子節點,獲得行的主鍵值,然後使用主鍵去聚簇索引中查詢資料行,這需要兩次b-tree查詢。
下面是innodb聚簇索引和非聚簇索引的示意圖(來自《高效能mysql(第三版)》:
mysql 聚簇索引表 Mysql的聚簇索引
聚簇索引並不是一種單獨的索引型別,而是一種資料儲存方式。innodb的聚簇索引實際上是在同乙個結構中儲存了b tree索引和資料行。乙個表只能有乙個聚簇索引。innodb中,葉子頁包含了行的全部資料,但是節點頁只包含了索引列。innodb通過主鍵聚集資料。優點 1.可以把相關資料儲存在一起。例如實現...
mysql 聚簇索引例項 MySQL聚簇索引
mysql作為迭代了很多個版本的資料庫。在資料庫的索引上實現了很多的優化版本,從一開始的只允許乙個表有乙個列為索引值,到目前版本可支援多個列建立索引值,更多關於索引優化版本的描述,以後有機會筆者再寫一篇文章。本文主要介紹索引當中的聚簇索引。mysql官方對聚簇索引的定義是,聚簇索引並不是一種單獨的索...
mysql聚簇索引設定 Mysql 聚簇索引
整體概述 1.innodb的主索引檔案上 直接存放該行資料,稱為聚簇索引,次索引指向對主鍵的引用 2.myisam中,主索引和次索引,都指向物理行 磁碟位置 哈哈,說了兩句貌似聽不懂的話。一。通俗解釋 我們可以這麼理解 聚簇索引 innodb 索引的葉節點就是資料節點,下邊實打實有資料。非聚簇索引 ...