本文使用 zhihu on vscode 創作並發布
b+-樹是有序的,平衡的多叉樹型結構,是資料庫系統中最為通用的索引資料結構。在傳統的關係型磁碟資料庫中,索引結構儲存在磁碟上,磁碟按頁(page)訪問,且隨機訪問時有較高的尋道延時(disk seek latency)。b+樹的結點塊結構適應了磁碟按塊i/o的模式,從而能減少每次資料訪問的i/o代價;針對純記憶體資料庫,b+樹的結點塊結構同樣能適應記憶體和cpu快取記憶體按cacheline互動的模式,從而能相比二叉樹等結構更能充分利用記憶體頻寬,減少cache缺失數量,易於維護。綜合而言,b+樹的多叉結點結構能夠充分適應上世紀磁碟特性,也能一定程度適應現代硬體結構。
那麼,最優的b+樹結點大小,在磁碟上就是乙個磁碟頁嗎,在記憶體中就是乙個cacheline嗎?本文將從針對磁碟,記憶體中的b+樹結構,分析兩種場景下的結點最優大小。
分析採用了以下假設:
分析使用到的符號:
分析過程:
(1)如果每個結點大小為b個頁,那麼每個結點會有
(2)當在n個待索引資料資料上建立索引時,b+樹樹高為
由(1),(2)可得從b+樹根節點搜尋到葉子結點,如果不考慮緩衝區命中,每次結點路徑遍歷的耗時為:
從函式關係可知
先減少後增大,對
進行求導,得到:
令上述導數為0,得到當
取 的唯一解時,b+樹的效能最優。由於
又和頁大小以及鍵值大小有關,
所以最優的磁碟b+樹結點大小和磁碟旋轉延時、傳輸速率
(傳輸頻寬)、頁大小和鍵值大小有關
。在不同的磁碟硬體下,儲存不同大小的鍵時,最優的結點大小均不同。
實際場景中,假設頁大小為4096b,單個鍵值大小為16b,一般b+樹滿載程度為0.69,參考[4],此時
約為176,因此粗略估算出
, 即. 如果磁碟旋轉延時為4ms,且傳輸頻寬為500mb/s,則可計算
,這表示結點大小取50個頁大小將使得效能較優。
記憶體中雖然也可將cacheline對等到磁碟頁,但是相比磁碟有以下兩點不同之處:
分析用到以下符號:
由於記憶體b+樹存在兩種結點掃瞄策略:二分查詢和線性查詢策略。前人工作表明,使用小結點時 (結點大小 < 256b ),線性查詢策略能達到更高的效能[5]。但是出於完備性,此處我們都進行分析。
採用二分查詢策略:
(1)二分查詢單個結點時,二分搜尋共需要訪問
個cacheline才能將二分搜尋範圍縮小到單個cacheline,故乙個結點搜尋的時間代價約為
.(2)同樣,當再n個資料上建立b+樹索引時,樹高為
綜合(1),(2)可以得出單次操作的結點遍歷代價:
一般而言,
,故可知
單調遞增,
後遞增幅度較小,所以b取1時效能稍優。
但是從函式關係可以看出,當b較大之時,查詢效能減幅較慢,逼近二分搜尋
。
採用線性查詢策略:
線性搜尋乙個結點時,搜尋平均需要訪問
個cacheline。因此單次操作的結點遍歷代價為:
經過函式單調性分析,同樣發現該函式在[1,
)為遞增函式,且遞增幅度較慢。故同樣可以得出當每個結點採用乙個cacheline大小時最優。
綜合以上兩者,可以得出如下結論:如果忽略cpu代價,記憶體b+樹採用單個cacheline大小能夠達到最優的時間效能,但是記憶體b+樹的時間代價受結點大小影響較小。
在實際場景中,我們發現大部分記憶體b+樹均採用256b (b取4) 或者512b (b取8) 作為常用結點大小,我認為主要有以下三點原因:
(1)每個結點需要額外的空間維護代價以及訪問時的固定cpu代價。
(2)現代處理器存在一定cache預取機制,它能夠隱藏訪問臨近cacheline的時間代價。
(3)單cacheline結點儘管訪問代價稍低,但是在插入負載容易頻繁觸發鍵值移動,結點**,容易造成額外代價。
歡迎交流指正,謝謝!
[1]. r. bayer and e. m. mccreight, 「organization and maintenance of large ordered indexes,」 sigfidet workshop, pp. 107–141, 1970.
[2]. j. gray and g. graefe, 「the five-minute rule ten years later, and other computer storage rules of thumb,」 special interest group on management of data record, vol. 26, no. 4, pp. 63–68, 1997.
[3]. latency numbers every programmer should know,
[4]. y. theodoridis, e. stefanakis, t. sellis, efficient cost models for spatial queries using r-trees. ieee tkde, 12(1), pp. 19-32, 2000
[5]. stx b+ tree revisiting binary search - panthema.net,
葉子結點和分支節點 樹的度和結點數的關係
一 概念 與圖論中的 度 不同,樹的度是如下定義的 有根樹t中,結點x的子女數目稱為x的度。也就是 在樹中,結點有幾個分叉,度就是幾。乙個有用的小公式 樹中結點數 總分叉數 1。這裡的分叉數就是所有結點的度之和 二 度的計算 1.設樹t的度為4,其中度為1,2,3,4的節點個數分別為4,2,1,1,...
葉子結點和分支節點 整數規劃 分支定界法
整數規劃的模型與線性規劃基本相同,只是額外的新增了部分變數為整數的約束。2.求解步驟 整數規劃求解的基本框架是分支定界法 branch and bound,bnb 首先去除整數約束得到 鬆弛模型 使用線性規劃的方法求解。若有某個變數不是整數,在鬆弛模型上分別新增約束 x floor a 和 x ce...
樹的度,度中結點的個數 葉子節點的個數關係
每條邊對應乙個節點,只有根節點沒有相應的邊。所以 節點個數 m 邊數 n 1 乙個度為4的節點對應有4條出邊,乙個度為3的節點對應有3條出邊,乙個度為2的節點對應有2條出邊,乙個度為1的節點對應有條出邊,葉子節點沒有出邊。所以 邊數 n 1 4 2 2 3 1 4 1 所有節點的度之和 15 根據 ...