索引 作用:提高數據查詢的效率 常用索引模型 哈希表 有序數組 搜索樹 哈希表 _以鍵值對的形式存儲,適合於只有等值查詢的場景。_ 用一個哈希函數把 換算成一個確定的位置,然後把 這個位置的數組中。一個 會對應一個數組,數組中會有多個 ,`value`並不是有序的。 查找時先通過哈希函數算出 ,找到 ...
索引
作用:提高數據查詢的效率
常用索引模型
- 哈希表
- 有序數組
- 搜索樹
哈希表
以鍵值對的形式存儲,適合於只有等值查詢的場景。
用一個哈希函數把key
換算成一個確定的位置,然後把value
這個位置的數組中。一個key
會對應一個數組,數組中會有多個value
,value
並不是有序的。
查找時先通過哈希函數算出key
,找到具體的數組,然後遍曆數組,找到具體的位置。
有序數組
以有序數組形式存儲,等值查詢和範圍查詢場景中性能非常優秀,只適用於靜態存儲引擎。
僅僅看查詢效率,有序數組就是最好的數據結構了,但是,在需要更新數據多的時候就麻煩了,你往中間插入一個記錄就必須得挪動後面所有的記錄,成本太高。
所以,有序數組索引只適用於靜態存儲引擎,比如你要保存2017年某個城市的所有人口信息,這類不會再修改的數據。
搜索樹
以類似二叉樹的多叉樹來實現。
- 二叉搜索樹:每個節點的左兒子小於父節點,父節點又小於右兒子。
- 多叉樹:每個節點有多個兒子,兒子之間的大小保證從左到右。
在MySQL
中,索引是在存儲引擎層實現的,所有並沒有同一的索引標準,即不同存儲引擎的索引的工作方式並不一樣。而即使多個存儲引擎支持同一種類型的索引,其底層的實現也可能不同。
InnoDB
使用了B+
樹索引模型,所有的數據都是存儲在B+
樹中的。每一個索引在InnoDB
裡面對應一棵B+
樹,主鍵索引對應主B+
樹。
- 主鍵索引:對應主
B+
樹,葉子節點存儲的是整行數據,也稱為聚簇索引 - 非主鍵索引:每個非主鍵索引對應一個
B+
樹,葉子節點存儲的是主鍵的值,也稱為二級索引。
基於主鍵索引和普通索引的查詢的區別?
- 如果語句是
select * from T where ID = 500
,主鍵查詢方式,即只需要搜索ID
這棵B+
樹,葉子節點中有存儲整行數據; - 如果語句是
select * from T where k = 5
,普通索引查詢方式,則需要先搜索k索引樹,得到主鍵ID
的值為500,再到主鍵ID
索引樹搜索一次,這個過程成為回表。
回到主鍵索引樹搜索的過程,我們稱為回表。
也就是說:基於非主鍵索引的查詢需要多掃描一顆索引樹。