深入理解B樹和B+樹(二)B+樹的優點
有了B樹,為什麼還需要B+樹呢?那就要先說下B樹的缺點了,人類對於效能的追求是無止境的,B樹相比二叉樹雖好,但還是存在以下問題:
1.每個節點中既要存索引資訊,又要存其對應的資料,如果資料很大,那麼當樹的體量很大時,每次讀到記憶體中的樹的資訊就會不太夠。
2.B樹遍歷整個樹的過程和二叉樹本質上是一樣的,B樹相對二叉樹雖然提高了磁碟IO效能,但並沒有解決遍歷元素效率低下的問題。
針對以上兩個問題,B+樹誕生了,B+樹相比B樹,本質上是一樣的,區別就在與B+樹的所有根節點都不帶有任何資料資訊,只有索引資訊,所有資料資訊全部儲存在葉子節點裡,這樣,整個樹的每個節點所佔的記憶體空間就變小了,讀到記憶體中的索引資訊就會更多一些,相當於減少了磁碟IO次數,問題1就得到了解決。又由B樹的性質可以得到,所有葉子節點都會在同一層,B+樹會以一個連結串列的形式將所有葉子節點的資訊全部串聯起來,這樣,想遍歷所有資料資訊只需要順序遍歷葉子節點就可以了,方便又高效,問題二就得到了解決。不僅如此,B+樹還有一個相應的優質特性,就是B+樹的查詢效率是非常穩定的,因為所有資訊都儲存在了葉子節點裡面,從根節點到所有葉子節點的路徑是相同的。那麼,我們總結一下B+樹的優點:
(1) B+樹的磁碟讀寫代價更低
B+的內部結點並沒有指向關鍵字具體資訊的指標。因此其內部結點相對B樹更小。如果把所有同一內部 結點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入記憶體中的需要查詢的 關鍵字也就越多。相對來說IO讀寫次數也就降低了。
(2)B+樹的資料資訊遍歷更加方便
B+樹只要遍歷葉子節點就可以實現整棵樹的遍歷,而B樹不支援這樣的操作(或者說效率太低),而且 在資料庫中基於範圍的查詢是非常頻繁的,所以資料庫索引基本採用B+樹
(3) B+樹的查詢效率更加穩定
由於非終結點並不是最終指向檔案內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查 找必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數據的查詢效率相 當。