B樹與B+樹的區別
我們先來看看Stack Overflow上面是怎麼解釋的(沒有梯子的,博主已經把回答copy下來了):
The image below helps show the differences between B+ trees and B trees.
Advantages of B+ trees:
Because B+ trees don't have data associated with interior nodes, more keys can fit on a page of memory. Therefore, it will require fewer cache misses in order to access data that is on a leaf node.
因為B+樹沒有與內部節點相關的資料,所以更多的key可以安裝在記憶體頁上。因此,為了訪問在葉節點上的資料,將需要更少的cache miss(快取記憶體未命中)。
The leaf nodes of B+ trees are linked, so doing a full scan of all objects in a tree requires just one linear pass through all the leaf nodes. A B tree, on the other hand, would require a traversal of every level in the tree. This full-tree traversal will likely involve more cache misses than the linear traversal of B+ leaves.
B+樹的葉節點是連結的,所以對樹中的所有物件進行全掃描只需要一次線性遍歷所有葉節點。另一方面,B樹需要遍歷樹中的每一層。這種全樹遍歷可能會涉及比B+葉的線性遍歷更多的快取記憶體未命中。
Advantage of B trees:
Because B trees contain data with each key, frequently accessed nodes can lie closer to the root, and therefore can be accessed more quickly.
因為B樹包含每個鍵的資料,所以頻繁訪問的節點可以更靠近根,因此可以更快地訪問。
用簡單的話說就是:
在B樹中,你可以將鍵和值存放在內部節點和葉子節點,但在B+樹中,內部節點都是鍵,沒有值。葉子節點同時存放鍵和值。
B+樹的葉子節點有一條鏈相連,而B+樹的葉子節點各自獨立。
使用B+樹的好處
- 由於B+樹的內部節點只存放鍵,不存放值,因此,一次讀取,可以在記憶體頁中獲取更多的鍵,有利於更快地縮小查詢範圍。
- B+樹的葉節點由一條鏈相連,因此,當需要進行一次全資料遍歷的時候,B+樹只需要使用O(logN)時間找到最小的一個節點,然後通過鏈進行O(N)的順序遍歷即可。而B樹則需要對樹的每一層進行遍歷,這會需要更多的記憶體置換次數,因此也就需要花費更多的時間
使用B樹的好處
B樹可以在內部節點同時儲存鍵和值,因此,把頻繁訪問的資料放在靠近根節點的地方將會大大提高熱點資料的查詢效率。這種特性使得B樹在特定資料重複多次查詢的場景中更加高效。
資料庫為什麼使用B+樹而不是B樹
因為就是上面提到的B+樹的好處。資料庫的資料讀取都是需要進行代價巨大的磁碟IO操作,因此,更快地縮小範圍和更少的讀取次數是資料庫需要關注的重點。而B+樹在這些點上比B樹做的更好。這就是為什麼資料庫要選用B+樹作為底層實現。