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

    Hash索引結構的特殊性,其檢索效率很是高,索引的檢索能夠一次定位,不像B-Tree索引須要從根節點到枝節點,最後才能訪問到頁節點這樣屢次的IO訪問,因此Hash索引的查詢效率要遠高於B-Tree索引。算法

  可能不少人又有疑問了,既然Hash索引的效率要比B-Tree高不少,爲何你們不都用Hash索引而還要使用B-Tree索引呢?任何事物都是有兩面性的,Hash索引也同樣,雖然Hash索引效率高,可是Hash索引自己因爲其特殊性也帶來了不少限制和弊端,主要有如下這些。數據庫

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

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

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

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

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

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

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

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

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

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

相關文章
相關標籤/搜索