B+樹索引和哈希索引的區別——我在想全文搜索引擎為啥不用hash索引而非得使用B+呢?


哈希文件也稱為散列文件,是利用哈希存儲方式組織的文件,亦稱為直接存取文件。它類似於哈希表,即根據文件中關鍵字的特點,設計一個哈希函數和處理沖突的方法,將記錄哈希到存儲設備上。

在哈希文件中,是使用一個函數(算法)來完成一種將關鍵字映射到存儲器地址的映射,根據用戶給出的關鍵字,經函數計算得到目標地址,再進行目標的檢索。

轉自:http://imysql.com/2016/01/06/mysql-faq-different-between-btree-and-hash-index.shtml

B+樹索引和哈希索引的區別

一個經典的B+樹索引數據結構見下圖:

20160106B樹索引
(圖片源自網絡)

B+樹是一個平衡的多叉樹,從根節點到每個葉子節點的高度差值不超過1,而且同層級的節點間有指針相互鏈接。

在B+樹上的常規檢索,從根節點到葉子節點的搜索效率基本相當,不會出現大幅波動,而且基於索引的順序掃描時,也可以利用雙向指針快速左右移動,效率非常高。因此,B+樹索引被廣泛應用於數據庫、文件系統等場景。

哈希索引的示意圖則是這樣的:
20160106哈希索引
(圖片源自網絡)

簡單地說,哈希索引就是采用一定的哈希算法,把鍵值換算成新的哈希值,檢索時不需要類似B+樹那樣從根節點到葉子節點逐級查找,只需一次哈希算法即可立刻定位到相應的位置,速度非常快。

從上面的圖來看,B+樹索引和哈希索引的明顯區別是:

  • 如果是等值查詢,那么哈希索引明顯有絕對優勢,因為只需要經過一次算法即可找到相應的鍵值;當然了,這個前提是,鍵值都是唯一的。如果鍵值不是唯一的,就需要先找到該鍵所在位置,然后再根據鏈表往后掃描,直到找到相應的數據;
  • 從示意圖中也能看到,如果是范圍查詢檢索,這時候哈希索引就毫無用武之地了,因為原先是有序的鍵值,經過哈希算法后,有可能變成不連續的了,就沒辦法再利用索引完成范圍查詢檢索;
  • 同理,哈希索引也沒辦法利用索引完成排序,以及like ‘xxx%’ 這樣的部分模糊查詢(這種部分模糊查詢,其實本質上也是范圍查詢);
  • 哈希索引也不支持多列聯合索引的最左匹配規則
  • B+樹索引的關鍵字檢索效率比較平均,不像B樹那樣波動幅度大,在有大量重復鍵值情況下,哈希索引的效率也是極低的,因為存在所謂的哈希碰撞問題

后記

通常,B+樹索引結構適用於絕大多數場景,像下面這種場景用哈希索引才更有優勢:

在HEAP表中,如果存儲的數據重復度很低(也就是說基數很大),對該列數據以等值查詢為主,沒有范圍查詢、沒有排序的時候,特別適合采用哈希索引

例如這種SQL:
SELECT … FROM t WHERE C1 = ?; — 僅等值查詢

在大多數場景下,都會有范圍查詢、排序、分組等查詢特征,用B+樹索引就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM