B-樹,B+樹與B*樹的優缺點比較
來源:互聯網
上載者:User
首先注意: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+樹要低,空間使用率更高;