首先注意:B樹就是B-樹,"-"是個連字符號,不是減號。
B-樹是一種平衡的多路查找(又稱排序)樹,在文件系統中有所應用。主要用作文件的索引。其中的B就表示平衡(Balance)
B+樹有一個最大的好處,方便掃庫,B樹必須用中序遍歷的方法按序掃庫,而B+樹直接從葉子結點挨個掃一遍就完了。
B+樹支持range-query(區間查詢)非常方便,而B樹不支持。這是數據庫選用B+樹的最主要原因。
比如要查 5-10之間的,B+樹一把到5這個標記,再一把到10,然后串起來就行了,B樹就非常麻煩。B樹的好處,就是成功查詢特別有利,因為樹的高度總體要比B+樹矮。不成功的情況下,B樹也比B+樹稍稍占一點點便宜。
B樹的優勢是當你要查找的值恰好處在一個非葉子節點時,查找到該節點就會成功並結束查詢,而B+樹由於非葉節點只是索引部分,這些節點中只含有其子樹中的最大(或最小)關鍵字,當非終端節點上的關鍵字等於給點值時,查找並不終止,而是繼續向下直到葉子節點。因此在B+樹中,無論查找成功與否,都是走了一條從根到葉子節點的路徑。
有很多基於頻率的搜索是選用B樹,越頻繁query的結點越往根上走,前提是需要對query做統計,而且要對key做一些變化。
另外B樹也好B+樹也好,根或者上面幾層因為被反復query,所以這幾塊基本都在內存中,不會出現讀磁盤IO,一般已啟動的時候,就會主動換入內存。 mysql底層存儲是用B+樹實現的,因為內存中B+樹是沒有優勢的,但是一到磁盤,B+樹的威力就出來了。
B樹
是B+樹的變體,在B+樹的非根和非葉子結點再增加指向兄弟的指針;B樹定義了非葉子結點關鍵字個數至少為(2/3)M,即塊的最低使用率為2/3(代替B+樹的1/2);
B+樹的分裂:當一個結點滿時,分配一個新的結點,並將原結點中1/2的數據復制到新結點,最后在父結點中增加新結點的指針;B+樹的分裂只影響原結點和父結點,而不會影響兄弟結點,所以它不需要指向兄弟的指針;
B樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那么將一部分數據移到兄弟結點中,再在原結點插入關鍵字,最后修改父結點中兄弟結點的關鍵字(因為兄弟結點的關鍵字范圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之間增加新結點,並各復制1/3的數據到新結點,最后在父結點增加新結點的指針;
所以,B*樹分配新結點的概率比B+樹要低,空間使用率更高;
轉自:https://blog.csdn.net/bigtree_3721/article/details/73632405