【MySQL】聚簇索引和非聚簇索引

mysql普遍使用B+樹做索引, 但在不同的存儲引擎中對索引的實現方式不同
InnoDB是聚簇索引
MyISAM是非聚簇索引

以一本字典爲例 如果想要翻到100頁, 則如果翻到了50頁就繼續向後翻, 如果翻到了120頁就往回翻, 翻到100頁即可獲得第100頁的內容, 這種即爲聚簇索引, 即B+樹的葉子節點直接存儲着數據.

如果想要得到index這個詞, 則需要翻開前面的目錄, 根據按字母排序的表找到i, 再找到index, 然後再根據頁碼翻到index的所在頁, 這種爲非聚簇索引, 即B+樹的葉子節點存放的是數據的地址.

InnoDB聚簇索引

  1. 主鍵索引
    一個B+樹保存了索引和具體的數據, key爲主鍵, 葉子存儲data數據行, 因此索引文件即爲數據文件.
    聚簇索引的數據的物理存放順序與索引順序是一致的, 所以在InnoDB引擎下必須要有主鍵, 最好設置ID爲自增的, 讓數據的物理地址連續, 使聚簇索引範圍查詢效率較高,這樣也可以減少磁盤碎片, 提高存儲效率.

  2. 輔助索引
    InnoDB的輔助索引葉子節點data存儲的是主鍵key值, 因爲數據是按照主鍵來存儲的, 所以使用輔助索引查找時首先根據輔助索引找到主鍵key值, 之後再根據key值去主鍵索引查詢獲得data.

MyISAM非聚簇索引

與聚簇索引不同的是葉子結點data存儲的是數據的地址. 通過索引先查詢到數據的地址, 再通過地址獲取數據,
所以索引文件和數據文件是分開的,索引的邏輯順序和物理地址順序沒有必然聯繫
所以在查詢時會多一次IO操作, 查詢性能上會差一些
因爲葉子節點存儲的是數據的地址, 所以輔助索引和主索引沒有太大區別.

123

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