3分鐘讓你記住B+樹索引和哈希索引的「愛恨情愁」

引言:

B+樹索引:經過根節點到葉節點逐層尋找,一步一縮小尋找的範圍對象,直至找到目標算法

Hash索引:採用必定的哈希算法,把鍵值更換成新的哈希值,檢索時不須要像B+樹那樣依次從根節點到葉節點逐層尋找,一次性能夠鎖定相應的位置,找到目標值。數據庫

1、「獨具特點」的B+樹

B+樹即Btree,它的樹形結構如同一棵樹木,可是倒立的樹木。因此咱們稱之爲B+樹索引。它的尋找目標值方式依次由根節點到葉節點。架構

即就是:B+樹左右支點都是相同數目的,因此稱之爲平衡的多叉樹,若是分爲兩個分叉則被稱爲平衡的二叉樹,即如下邊樹木爲例,以中間軀幹爲中點,左右對稱。由根到支點高度爲1,任何節點的兩個子樹的高度爲1,即由根到葉節點須要一層指向一層。各個節點之間用指針進行鏈接。根與葉子之間相鏈接的軀幹被稱之爲指針。併發

以上兩幅對比能夠看出,B+樹索引就像一棵倒立的樹木,樹根咱們稱之爲根節點在上方,葉子咱們稱之爲葉節點在下方。根節點鏈接的左右葉節點是對稱的,因此稱之爲平衡的多叉樹。跟與葉子之間的箭頭叫作指針,從左邊節點分析,可在第一層尋找數值應該在[15,20]之間,在第二層又進行細分,數值在[15,18]之間,以此類推找到目標值。能夠看出B+樹索引是經過範圍來尋找目標值的。分佈式

B+樹索引的應用場景和不適用場景:函數

  • 適用於數據庫,文件系統等場景,由於這些對象都是層層包含的,文件裏包含其餘文件,須要逐層縮小範圍來尋找。
  • 支持左右查詢,利用的是B+樹葉節點的指針是雙向的
  • 不適用於等值查詢

2、「情有獨鍾」的哈希索引

哈希索引:哈希索引使用的是哈希算法,這裏的算法指的是使用必定的函數,即經過尋找鍵值,來找到所尋找的對象。微服務

哈希算法即散列函數,它就是將明文翻譯成一段固定長度的字符串密碼,且是單向的。所以採用哈希算法不管你以前明文有多長,通過算法輸出後都是固定長度的字符串密碼。表明算法有MD5,MD4…..高併發

舉個例子:好比說咱們在百度上想要搜 佩奇的圖片,當沒有任何外在的標識狀況下,在巨量的圖片庫裏你想要找到佩奇的圖片,你以爲是否是很困難。在這種狀況下,咱們能夠經過哈希索引,它會將圖片庫裏的圖片轉化成一串0-1的編碼。這樣你就會發現,圖片相近編碼也會變得很相近。這樣咱們在百度裏一輸入「佩奇」這樣的編碼,就會出來許多張佩奇的圖片。這就是所謂的哈希索引。源碼分析

優勢:效率高,能夠一次就直接找到目標性能

哈希索引示意圖:

上圖說明:當咱們在百度中輸入「佩奇」做爲鍵值,而後所謂的Hash索引就會在圖片庫中找到標識符也爲「佩奇」的編碼,而後就能夠搜索出佩奇的圖片了。因此它不屬於範圍搜索。

哈希索引的應用場景和不適合場景:

  • 支持等值查詢:前提條件沒有過多重複的鍵值,若是存在的話,會下降哈希索引的效率,發生哈希碰撞問題。
  • 範圍查詢則不合適哈希索引
  • 哈希索引不能被用來避免數據排序操做
  • 哈希索引不支持最左匹配規則,由於鍵值更換成哈希值是單向的

3、各顯神通的B+與哈希

根據上面兩種索引的示意圖能夠得出如下的不一樣結論:

  • Hash索引的效率要高於B+樹索引。B+ 樹是一個平衡的多叉樹,因此從根節點到葉子節點的搜索效率是差很少的,基本不會出現波動,也能夠進行順序掃描,即利用B+樹的雙向指針能夠左右移動,雙反方向的查找,效率很高。 Hash 索引,根據鍵值做爲「字符串」,能夠一次性的檢索到位。不須要像B+樹索引同樣,由根節點到葉節點一層一層的尋找,因此,Hash 索引的檢索效率要高於B+索引。
  • 等值查找Hash佔優點,必定範爲內B+樹索引佔優點。因爲Hash索引是經過鍵值來查找的,須要鍵值相等纔可以找到所須要的值。不能用於基於某一個範圍內的查找,而B+樹索引能夠實現範圍內查找。所以在等鍵值查找出,Hash 索引優點明顯; 在某一範圍內查找,B+樹索引優點明顯。
  • B+樹效率較均等化,Hash索引起生碰觸狀況下效率大減。B+樹索引因爲是(左右)平衡的多叉樹,因此在索引過程當中效率畢竟均等化,不會出現幅度的大起大落。 而Hash索引,在有大量重複的鍵值狀況下,效率都會很低,由於那麼多相同的鍵值,都會索引,它也不能分清哪一個鍵值背後的存儲對象是它所要找的目標,索引就會發生哈希碰撞問題。
  • B+樹索引更適合數據庫的模糊查詢。對於像數據庫中 select * from [user] where name like’%三%’,查找名字帶三的模糊查詢,Hash 是沒法完成的, 模糊查詢本質上也屬於範圍索引,故在此種狀況下,應該使用B+ 樹索引。
  • 想免費學習Java工程化、分佈式架構、高併發、高性能、深刻淺出、微服務架構、Spring,MyBatis,Netty源碼分析等技術的朋友,能夠加羣:834962734,羣裏有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給你們,歡迎進羣一塊兒深刻交流學習。

相關文章
相關標籤/搜索