閒扯B-Tree和B+Tree的異同

##

 

B樹和B+樹其實都是平衡搜索樹。這裏要腦補一下平衡搜索樹的概念:這個詞劃分一下就是平衡+搜索+樹。也就是說,他首先是一棵樹,其次能搜索,再次他是平衡的。大家耳熟能詳的一個概念:二叉平衡搜索樹。(詳細的大家可以在百度上搜一下定義,或者拿起那本厚實的「算法導論」看看)。

 

##

 

但是B樹和B+樹卻有不同的地方。就是這些不同的地方,決定了他們的用處可能不一樣。

 



我畫了一個不太漂亮的B樹的圖。我們可以看到B樹裏面,每個結點有這樣的特點:不論是葉結點還是非葉結點,都含有Key和一個指向數據的指針。這樣,一旦找到某個結點以後,就可以根據指針找到對應的磁盤地址。

 

但是,這也帶來了另外的問題,就是每一個數據的指針會帶來額外的內存佔用,從而減少放入內存的結點數。

 



我們再回頭看看B+樹,他有兩個明顯的特徵:

 

1、所有的葉子結點纔有指向數據的指針。非葉結點就是純的索引數據。這樣的好處在於,我們可以將儘可能的非葉結點載入內存,沒有浪費。

 

2、大家注意看那個紅色的箭頭,每個葉結點都有指向下一個葉結點的鏈接。這樣的好處在於,我們可以從任意一個葉結點開始遍歷,獲取接下來所有的數據。

 

所以,綜合來看,B+TreeB-Tree少了點兒東西,又多了點兒東西。這樣就使得很多數據庫在選擇索引數據結構的時候,選擇了B+Tree(也不是所有的)。

 

比如,我們寫一條Sqlselect * from alphabets order by key_word;

 

大家想想,如果用B樹和B+樹,怎麼樣來實現這樣的功能?B樹好像比較爲難。B+樹則可以直接用葉結點的索引鏈遍歷。

 

這樣看起來,B+樹似乎比B樹強很多。但是,任何算法和數據結構都有適用他的地方。如果沒有order by這樣類似的需求,而B樹實現的成本比B+樹要低,那麼採用B樹也是一種不錯的選擇。所謂的沒有最好,只有更適合。選擇適合的最重要~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章