前言
博客編寫人:Willam
博客編寫時間:2017/3/28
博主郵箱:2930526477@qq.com(有志同道合之人,可以加qq交流交流編程心得)
1、B+樹的介紹
B+樹是B-樹的變體,也是一種多路搜索樹:
其定義基本與B-樹同,除了:
- 有n顆子樹的結點中含有n個關鍵字
- 所有的葉子結點中包含了全部關鍵字的信息,以及指向包含這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小而大順序鏈接
- 所有的非終端結點可以看成索引部分,結點中僅含有其子樹(根結點)中最大(或最小)關鍵字。
如下圖所示,就是一個B+樹
- 根結點只有1個,分支數量範圍[2,m]。
- 除根以外的非葉子結點,每個結點包含分支數範圍[[m/2],m],其中[m/2]表示取大於m/2的最小整數。
- 所有非葉子節點的關鍵字數目等於它的分支數量
- 所有葉子節點都在同一層,且關鍵字數目範圍是[[m/2],m],其中[m/2]表示取大於m/2的最小整數。
所有非葉子節點的關鍵字可以看成是索引部分,這些索引等於其子樹(根結點)中的最大(或最小)關鍵
字。例如一個非葉子節點包含信息: (n,A0,K0, A1,K1,……,Kn,An),其中Ki爲關鍵字,Ai爲指向子樹根結點的指針,n表示關鍵字個數。即Ai所指子樹中的關鍵字均小於或等於Ki,而Ai+1所指的關鍵字均大於Ki(i=1,2,……,n)。葉子節點包含全部關鍵字的信息(非葉子節點只包含索引),且葉子結點中的所有關鍵字依照大小順序鏈接(所以一個B+樹通常有兩個頭指針,一個是指向根節點的root,另一個是指向最小關鍵字的sqt)。
。
2、B+樹比B-樹的優勢
下面是B+樹和B-樹的一個對比截圖:(來自:參考文件)
爲什麼說B+-tree比B 樹更適合實際應用中操作系統的文件索引和數據庫索引?(摘抄自:參考文件)
(1)B+-tree的磁盤讀寫代價更低
B+-tree的內部結點並沒有指向關鍵字具體信息的指針。因此其內部結點相對B 樹更小。如果把所有同一內部結點的關
鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入內存中的需要查找的關鍵字也就越多。相
對來說IO讀寫次數也就降低了。
舉個例子,假設磁盤中的一個盤塊容納16bytes,而一個關鍵字2bytes,一個關鍵字具體信息指針2bytes。一棵
9階B-tree ( 一個結點最多8個關鍵字) 的內部結點需要2個盤快。而B+ 樹內部結點只需要1個盤快。當需要把
內部結點讀入內存中的時候,B 樹就比B+ 樹多一次盤塊查找時間(在磁盤中就是盤片旋轉的時間)。
(2)B+-tree的查詢效率更加穩定
由於非終結點並不是最終指向文件內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查找必須走一條從
根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數據的查詢效率相當。
好的博客推薦:
https://www.phpsong.com/752.html
https://yq.aliyun.com/articles/9280
http://blog.csdn.net/qq_23217629/article/details/52512041?locationNum=9&fps=1