MYSQL效能調優: 對聚簇索引和非聚簇索引的認識
聚簇索引是對磁碟上實際資料重新組織以按指定的一個或多個列的值排序的演算法。特點是儲存資料的順序和索引順序一致。
一般情況下主鍵會預設建立聚簇索引,且一張表只允許存在一個聚簇索引。
在《資料庫原理》一書中是這麼解釋聚簇索引和非聚簇索引的區別的:
聚簇索引的葉子節點就是資料節點,而非聚簇索引的葉子節點仍然是索引節點,只不過有指向對應資料塊的指標。
因此,MYSQL中不同的資料儲存引擎對聚簇索引的支援不同就很好解釋了。
下面,我們可以看一下MYSQL中MYISAM和INNODB兩種引擎的索引結構。
MYISAM是按列值與行號來組織索引的。它的葉子節點中儲存的實際上是指向存放資料的物理塊的指標。
從MYISAM儲存的物理檔案我們能看出,MYISAM引擎的索引檔案(.MYI)和資料檔案(.MYD)是相互獨立的。
而InnoDB按聚簇索引的形式儲存資料,所以它的資料佈局有著很大的不同。它儲存資料的結構大致如下:
注:聚簇索引中的每個葉子節點包含主鍵值、事務ID、回滾指標(rollback pointer用於事務和MVCC)和餘下的列(如col2)。
INNODB的二級索引與主鍵索引有很大的不同。InnoDB的二級索引的葉子包含主鍵值,而不是行指標(row pointers),這減小了移動資料或者資料頁面分裂時維護二級索引的開銷,因為InnoDB不需要更新索引的行指標。其結構大致如下:
InnoDB的的二級索引的葉子節點存放的是KEY欄位加主鍵值。因此,通過二級索引查詢首先查到是主鍵值,然後InnoDB再根據查到的主鍵值通過主鍵索引找到相應的資料塊。而MyISAM的二級索引葉子節點存放的還是列值與行號的組合,葉子節點中儲存的是資料的實體地址。所以可以看出MYISAM的主鍵索引和二級索引沒有任何區別,主鍵索引僅僅只是一個叫做PRIMARY的唯一、非空的索引,且MYISAM引擎中可以不設主鍵。
參考資料:
高效能MYSQL
By Perry.Zhang
09.16.2012
Update: 11.24.2014