MySQL索引 B+tree和hash那些事兒

1、B+樹索引
在這裏插入圖片描述
1)、B+樹首先是有序結構,爲了不至於樹的高度太高,影響查找效率,在葉子節點上存儲的不是單個數據,而是一頁數據,提高了查找效率,而爲了更好的支持範圍查詢,B+樹在葉子節點冗餘了非葉子節點數據,爲了支持翻頁,葉子節點之間通過指針連接;
2)、B+樹是一個平衡的多叉樹,從根節點到每個葉子節點的高度差值不超過1,而且同層級的節點間有指針相互鏈接;
3)、在B+樹上的常規檢索,從根節點到葉子節點的搜索效率基本相當,不會出現大幅波動,而且基於索引的順序掃描時,也可以利用雙向指針快速左右移動,效率非常高;
4)、在 Innodb存儲引擎中如果通過主鍵來訪問數據效率是非常高的,而如果是通過 Secondary Index 來訪問數據的話, Innodb存儲引擎首先通過 Secondary Index 的相關信息,通過相應的索引鍵檢索到 Leaf Node之後,需要再通過 Leaf Node 中存放的主鍵值再通過主鍵索引來獲取相應的數據行。MyISAM 存儲引擎的主鍵索引和非主鍵索引差別很小,只不過是主鍵索引的索引鍵是一個唯一且非空 的鍵而已。而且 MyISAM 存儲引擎的索引和 Innodb 的 Secondary Index 的存儲結構也基本相同,主要的區別只是 MyISAM 存儲引擎在 Leaf Nodes 上面出了存放索引鍵信息之外,再存放能直接定位到 MyISAM 數據文件中相應的數據行的信息(如 Row Number ),但並不會存放主鍵的鍵值信息 ;

2、hash 索引
在這裏插入圖片描述
1)、hash是key,value形式,通過一個散列函數,能夠根據key快速找到value;
2)、哈希索引就是採用一定的哈希算法,把鍵值換算成新的哈希值,檢索時不需要類似B+樹那樣從根節點到葉子節點逐級查找,只需一次哈希算法即可立刻定位到相應的位置,速度非常快;

B+樹索引和哈希索引的明顯區別是:
1)、如果是等值查詢,那麼哈希索引明顯有絕對優勢,因爲只需要經過一次算法即可找到相應的鍵值;當然了,這個前提是,鍵值都是唯一的。如果鍵值不是唯一的,就需要先找到該鍵所在位置,然後再根據鏈表往後掃描,直到找到相應的數據;
2)、從示意圖中也能看到,如果是範圍查詢檢索,這時候哈希索引就毫無用武之地了,因爲原先是有序的鍵值,經過哈希算法後,有可能變成不連續的了,就沒辦法再利用索引完成範圍查詢檢索;
3)、同理,哈希索引也沒辦法利用索引完成排序,以及like ‘xxx%’ 這樣的部分模糊查詢(這種部分模糊查詢,其實本質上也是範圍查詢);
4)、哈希索引也不支持多列聯合索引的最左匹配規則;
5)、B+樹索引的關鍵字檢索效率比較平均,不像B樹那樣波動幅度大,在有大量重複鍵值情況下,哈希索引的效率也是極低的,因爲存在所謂的哈希碰撞問題。

參考地址:
https://www.cnblogs.com/heiming/p/5865101.html
https://www.cnblogs.com/baizhanshi/p/9869654.html

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