mysql索引之雜湊索引

2021-10-12 12:39:18 字數 1610 閱讀 5353

雜湊演算法時間複雜度為o(1),且不只存在於索引中,每個資料庫應用中都存在該資料結構。

雜湊表也為雜湊表,又直接定址改進而來。在雜湊的方式下,乙個元素k處於h(k)中,即利用雜湊函式h,根據關鍵字k計算出槽的位置。函式h將關鍵字域對映到雜湊表t[0...m-1]的槽位上。

上圖中雜湊函式h有可能將兩個不同的關鍵字對映到相同的位置,這叫做碰撞,在資料庫中一般採用鏈結法來解決。在鏈結法中,將雜湊到同一槽位的元素放在乙個鍊錶中,如下圖所示:

innodb中採用除法雜湊函式,衝突機制採用鏈結法。

hash索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像b-tree索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以hash索引的查詢效率要遠高於b-tree索引。

可能很多人又有疑問了,既然hash索引的效率要比b-tree高很多,為什麼大家不都用hash索引而還要使用b-tree索引呢?任何事物都是有兩面性的,hash索引也一樣,雖然hash索引效率高,但是hash索引本身由於其特殊性也帶來了很多限制和弊端,主要有以下這些:

hash索引僅僅能滿足"=","in"和"<=>"查詢,不能使用範圍查詢。雜湊索引只支援等值比較查詢,包括=、 in 、<=>(注意<>和<=>是不同的操作)。 也不支援任何範圍查詢,例如where price > 100。  

由於hash索引比較的是進行hash運算之後的hash值,所以它只能用於等值的過濾,不能用於基於範圍的過濾,因為經過相應的hash演算法處理之後的hash值的大小關係,並不能保證和hash運算前完全一樣。hash索引無法被用來避免資料的排序操作。  

由於hash索引中存放的是經過hash計算之後的hash值,而且hash值的大小關係並不一定和hash運算前的鍵值完全一樣,所以資料庫無法利用索引的資料來避免任何排序運算;

hash索引不能利用部分索引鍵查詢。  

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

hash索引在任何時候都不能避免表掃瞄。  

前面已經知道,hash索引是將索引鍵通過hash運算之後,將 hash運算結果的hash值和所對應的行指標資訊存放於乙個hash表中,由於不同索引鍵存在相同hash值,所以即使取滿足某個hash鍵值的資料的記錄條數,也無法從hash索引中直接完成查詢,還是要通過訪問表中的實際資料進行相應的比較,並得到相應的結果。

hash索引遇到大量hash值相等的情況後效能並不一定就會比btree索引高。 

對於選擇性比較低的索引鍵,如果建立hash索引,那麼將會存在大量記錄指標資訊存於同乙個hash值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表資料的訪問,而造成整體效能低下。

mysql索引之雜湊索引

雜湊演算法時間複雜度為o 1 且不只存在於索引中,每個資料庫應用中都存在該資料結構。雜湊表也為雜湊表,又直接定址改進而來。在雜湊的方式下,乙個元素k處於h k 中,即利用雜湊函式h,根據關鍵字k計算出槽的位置。函式h將關鍵字域對映到雜湊表t 0.m 1 的槽位上。上圖中雜湊函式h有可能將兩個不同的關...

mysql 雜湊索引 MySQL索引之雜湊索引

雜湊索引 hash index 建立在雜湊表的基礎上,它只對使用了索引中的每一列的精確查詢有用。對於每一行,儲存引擎計算出了被索引的雜湊碼 hash code 它是乙個較小的值,並且有可能和其他行的雜湊碼不同。它把雜湊碼儲存在索引中,並且儲存了乙個指向雜湊表中的每一行的指標。在mysql中,只有me...

mysql之BTree索引 和 雜湊索引

排好序的快速查詢資料結構。索引會影響where後面的查詢,和order by 後面的排序。基於雜湊表實現,只有精確匹配索引所有列的查詢才有效。對於每一行資料,儲存引擎都會對所有的索引列計算乙個雜湊碼 hash code 並且hash索引將所有的雜湊碼儲存在索引中,同時在索引表中儲存指向每個資料行的指...