Mysql索引類型Btree和Hash的區別以及使用場景

遇到單表數據量大的時候很多開發者都會想到給相對的字段建立索引來提高性能(mysql索引的使用),但很少會去關注索引的類型該如何選擇,在mysql中支持有兩種類型,最常用的也是默認的Btree類型,其次就是最容易被忽略的Hash類型。下面將分別介紹兩種索引類型的區別。

 

Btree類型的索引,Btree又稱b+樹

 

(1)所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好是有序的;(只有根節點存儲關鍵字最後樹的末梢纔有值)

(2)非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是存儲(關鍵字)數據的數據層。(非根節點,存儲的其實是指向根節點的索引

(3) 不可能在非葉子結點存數據。

(4)根節點橫向也有鏈指針(方便快速順藤摸瓜嘛,沒這個指針,就算下一個取的值是挨着的鄰居,也得跑個圈才能拿到)

通過上述分析,所以能直觀的理解出Btree類型在我們查詢數據時適合用於範圍查找,在某一葉子的節點到另一節點的範圍。例如<,>,orderby等場景都可使用。

 

Hash索引,其檢索效率非常高的一種精確定位索引

Hash索引不像B-Tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的IO訪問,所以 Hash 索引的查詢效率要遠高於 B-Tree 索引,它會將計算出的Hash值和對對應的行指針信息記錄在Hash表中。但是雖然Hash效率很高但是同樣也有很多的弊端存在和限制存在。

(1)Hash 索引僅僅能滿足"=","IN"和"<=>"查詢,不能使用範圍查詢。

(2)Hash 索引無法被用來避免數據的排序操作。

(3)Hash 索引不能利用部分索引鍵(組合索引)查詢。

(4)Hash 索引在任何時候都不能避免表掃描。

(5)Hash 索引遇到大量Hash值相等的情況後性能並不一定就會比B-Tree索引高。

因爲Hash 索引比較的是進行 Hash 運算之後的 Hash 值,所以它只能用於等值的過濾,不能用於基於範圍的過濾。經過相應的 Hash 算法處理之後的 Hash 值的大小關係,並不能保證和Hash運算前完全一樣,數據庫自然也無法利用索引的數據來避免任何排序運算。

Hash 索引在計算 Hash 值的時候是組合索引鍵合併後再一起計算 Hash 值,而不是單獨計算 Hash 值,所以通過組合索引的前面一個或幾個索引鍵進行查詢的時候,Hash 索引也無法被利用。

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