MYSQL索引:對聚簇索引和非聚簇索引的認識

聚簇索引是對磁盤上實際數據重新組織以按指定的一個或多個列的值排序的算法。特點是存儲數據的順序和索引順序一致。
一般情況下主鍵會默認創建聚簇索引,且一張表只允許存在一個聚簇索引。

在《數據庫原理》一書中是這麼解釋聚簇索引和非聚簇索引的區別的:
聚簇索引的葉子節點就是數據節點,而非聚簇索引的葉子節點仍然是索引節點,只不過有指向對應數據塊的指針。

因此,MYSQL中不同的數據存儲引擎對聚簇索引的支持不同就很好解釋了。
下面,我們可以看一下MYSQL中MYISAM和INNODB兩種引擎的索引結構。

如原始數據爲:

MyISAM引擎的數據存儲方式如圖:

MYISAM是按列值與行號來組織索引的。它的葉子節點中保存的實際上是指向存放數據的物理塊的指針。
從MYISAM存儲的物理文件我們能看出,MYISAM引擎的索引文件(.MYI)和數據文件(.MYD)是相互獨立的。

而InnoDB按聚簇索引的形式存儲數據,所以它的數據佈局有着很大的不同。它存儲數據的結構大致如下:

注:聚簇索引中的每個葉子節點包含主鍵值、事務ID、回滾指針(rollback pointer用於事務和MVCC)和餘下的列(如col2)。

INNODB的二級索引與主鍵索引有很大的不同。InnoDB的二級索引的葉子包含主鍵值,而不是行指針(row pointers),這減小了移動數據或者數據頁面分裂時維護二級索引的開銷,因爲InnoDB不需要更新索引的行指針。其結構大致如下:

INNODB和MYISAM的主鍵索引與二級索引的對比:

InnoDB的的二級索引的葉子節點存放的是KEY字段加主鍵值。因此,通過二級索引查詢首先查到是主鍵值,然後InnoDB再根據查到的主鍵值通過主鍵索引找到相應的數據塊。而MyISAM的二級索引葉子節點存放的還是列值與行號的組合,葉子節點中保存的是數據的物理地址。所以可以看出MYISAM的主鍵索引和二級索引沒有任何區別,主鍵索引僅僅只是一個叫做PRIMARY的唯一、非空的索引,且MYISAM引擎中可以不設主鍵。

參考資料:
高性能MYSQL

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章