Hash索引和B 樹索引的區別

2021-10-23 02:30:49 字數 1488 閱讀 7804

我們都知道在mysql中索引的資料結構有兩種,一種是hash,另一種是btree。在資料表中建立什麼樣的索引需要我們根據實際情況進行選擇。

b+樹結構示意圖:

b+樹的特徵:

1、有k個孩子的節點就有k個關鍵字。也就是孩子數量=關鍵字數。

2、非葉子節點的關鍵字也會同時存在在子節點中,並且是在子節點中所有關鍵字的最大或最小。

3、非葉子節點僅用於索引,不儲存資料記錄,跟記錄有關的資訊都放在葉子節點中。

4、所有關鍵字都在葉子節點出現,葉子節點構成乙個有序鍊錶,而且葉子節點本身按照關鍵字的大小從小到大順序鏈結。

hash索引示意圖:

鍵值key通過hash對映找到桶bucket。桶指的是乙個能儲存一條或多條記錄的儲存單位。乙個桶的結構包含了乙個記憶體指標陣列,桶中的每行資料都會指向下一行,形成鍊錶結構,當遇到hash衝突時,會在桶中進行鍵值的查詢。

hash衝突:

如果桶的空間小於輸入的空間,不同的輸入可能會對映到同乙個桶中,這時就會產生hash衝突,如果hash衝突的量很大,就會影響讀取效能。

由於hash索引結構和b+ 樹不同,因此在索引使用上也會有差別:

(1)hash索引不能進行範圍查詢,而b+樹可以。

這是因為hash索引指向的資料是無序的,而b+ 樹的葉子節點是個有序的鍊錶。

(2)hash索引不支援聯合索引的最左側原則(即聯合索引的部分索引無法使用),而b+樹可以。

對於聯合索引來說,hash索引在計算hash值的時候是將索引鍵合併後再一起計算hash值,所以不會針對每個索引單獨計算hash值。因此如果用到聯合索引的乙個或多個索引時,聯合索引無法被利用。

(3)hash索引不支援order by排序,而b+樹支援。

因為hash索引指向的資料是無序的,因此無法起到排序優化的作用,而b+樹索引資料是有序的,可以起到對該字段order by 排序優化的作用。

(4)hash索引無法進行模糊查詢。而b+ 樹使用 like 進行模糊查詢的時候,like後面前模糊查詢(比如%開頭)的話可以起到優化的作用。

(5)hash索引在等值查詢上比b+樹效率更高。

不過也存在一種情況,就是索引列的重複值如果很多,效率就會降低。這是因為遇到hash衝突時,需要遍歷桶中的行指標來進行比較,找到查詢的關鍵字非常耗時。所以hash索引通常不會用到重複值多的列上,比如列為性別,年齡等。

從上述描述中我們能看出hash索引存在著很多限制,相比之下在資料庫中b+樹索引的使用面會更廣。

mysql在5.5版本以後預設的儲存引擎是innodb,在innodb儲存引擎中還有個「自適應hash索引」的功能,就是當某個索引值使用非常頻繁的時候,它會在b+ 樹索引的基礎上再建立乙個hash索引,就是讓b+樹也具備了hash索引的優點。當遇到字段重複度低,而且經常需要進行等值查詢的時候,採用hash索引是個不錯的選擇。所以選擇hash還是b+樹還應該視專案具體情況而定。

hash索引和B 索引區別

hash 索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像b tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以 hash 索引的查詢效率要遠高於 b tree 索引。可 能很多人又有疑問了,既然 hash 索引的效率要比 b tree 高很多,為什麼大...

B樹索引 hash索引

索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。對於乙個表中幾百萬行資料來說,如果不使用索引,每次查詢都需要遍歷一遍所有的行,從而找到所需要的資料,平均查詢效率o n 如果使用了索引,在查詢時會先找索引,快速定位到磁碟位置,然後再去讀出該行的資料,效率大大...

索引有B 索引和hash索引,各自的區別

hash索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像b 樹索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,那為什麼大家不都用hash索引而還要使用b 樹索引呢?1.hash索引僅僅能滿足 in 和 查詢,不能使用範圍查詢。因為經過相應的hash演算法處理之後的h...