MySQL Hash索引和B-Tree索引的區別

MySQL Hash索引和B-Tree索引的區別究竟在哪裏呢?相信不少人都有這樣的疑問,下文對二者的區別進行了詳細的分析,供您參考。 算法

MySQL Hash索引結構的特殊性,其檢索效率很是高,索引的檢索能夠一次定位,不像B-Tree 索引須要從根節點到枝節點,最後才能訪問到頁節點這樣屢次的IO訪問,因此 Hash 索引的查詢效率要遠高於 B-Tree 索引。 
可 能不少人又有疑問了,既然 Hash 索引的效率要比 B-Tree 高不少,爲何你們不都用 Hash 索引而還要使用 B-Tree 索引呢?任何事物都是有兩面性的,Hash 索引也同樣,雖然 Hash 索引效率高,可是 Hash 索引自己因爲其特殊性也帶來了不少限制和弊端,主要有如下這些。 數據庫

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

因爲 MySQL Hash索引比較的是進行 Hash 運算以後的 Hash 值,因此它只能用於等值的過濾,不能用於基於範圍的過濾,由於通過相應的 Hash 算法處理以後的 Hash 值的大小關係,並不能保證和Hash運算前徹底同樣。 指針

(2)MySQL Hash索引沒法被用來避免數據的排序操做。 htm

因爲 MySQL Hash索引中存放的是通過 Hash 計算以後的 Hash 值,並且Hash值的大小關係並不必定和 Hash 運算前的鍵值徹底同樣,因此數據庫沒法利用索引的數據來避免任何排序運算; 排序

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

對於組合索引,Hash 索引在計算 Hash 值的時候是組合索引鍵合併後再一塊兒計算 Hash 值,而不是單獨計算 Hash 值,因此經過組合索引的前面一個或幾個索引鍵進行查詢的時候,Hash 索引也沒法被利用。 get

(4)MySQL Hash索引在任什麼時候候都不能避免表掃描。 效率

前面已經知道,Hash 索引是將索引鍵經過 Hash 運算以後,將 Hash運算結果的 Hash 值和所對應的行指針信息存放於一個 Hash 表中,因爲不一樣索引鍵存在相同 Hash 值,因此即便取知足某個 Hash 鍵值的數據的記錄條數,也沒法從 Hash 索引中直接完成查詢,仍是要經過訪問表中的實際數據進行相應的比較,並獲得相應的結果。 數據

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

對於選擇性比較低的索引鍵,若是建立 Hash 索引,那麼將會存在大量記錄指針信息存於同一個 Hash 值相關聯。這樣要定位某一條記錄時就會很是麻煩,會浪費屢次表數據的訪問,而形成總體性能低下。 

相關文章
相關標籤/搜索