1. 程式人生 > >b樹和hash的應用場景

b樹和hash的應用場景

關係型資料庫中,索引大多采用B/B+樹來作為儲存結構,而全文搜尋引擎的索引則主要採用hash的儲存結構,這兩種資料結構有什麼區別?
  • 如果是等值查詢,那麼雜湊索引明顯有絕對優勢,因為只需要經過一次演算法即可找到相應的鍵值;當然了,這個前提是,鍵值都是唯一的。如果鍵值不是唯一的,就需要先找到該鍵所在位置,然後再根據連結串列往後掃描,直到找到相應的資料;

  • 從示意圖中也能看到,如果是範圍查詢檢索,這時候雜湊索引就毫無用武之地了,因為原先是有序的鍵值,經過雜湊演算法後,有可能變成不連續的了,就沒辦法再利用索引完成範圍查詢檢索;

  • 同理,雜湊索引也沒辦法利用索引完成排序,以及like ‘xxx%’ 這樣的部分模糊查詢(這種部分模糊查詢,其實本質上也是範圍查詢);

  • 雜湊索引也不支援多列聯合索引的最左匹配規則

  • B+樹索引的關鍵字檢索效率比較平均,不像B樹那樣波動幅度大,在有大量重複鍵值情況下,雜湊索引的效率也是極低的,因為存在所謂的雜湊碰撞問題

hash結構的特點:檢索效率非常高,索引的檢索可以一次到位,O(1)。B樹需要從根節點到枝節點,最後才能到葉節點進行多次I/O操作,所以hash的效率遠遠高於B樹的效率。

那麼為什麼資料庫索引還是用B樹結構呢?

1、hash索引僅滿足“=”、“IN”和“<=>”查詢,不能使用範圍查詢

因為hash索引比較的是經常hash運算之後的hash值,因此只能進行等值的過濾,不能基於範圍的查詢,因為經過hash演算法處理後的hash值的大小關係,並不能保證與處理前的hash大小關係對應。

2、hash索引無法被用來進行資料的排序操作

由於hash索引中存放的都是經過hash計算之後的值,而hash值的大小關係不一定與hash計算之前的值一樣,所以資料庫無法利用hash索引中的值進行排序操作。

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

4、Hash 索引遇到大量Hash值相等的情況後效能並不一定就會比B-Tree索引高

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

(因此:鍵值重複率低的適合用B樹索引)

b-tree完全基於key的比較,和二叉樹相同的道理,相當於建個排序後的資料集,使用二分法查詢演算法,實際上也非常快,而且受資料量增長影響非常小