常見問題:MySQL/B+樹


平衡二叉樹

此前講紅黑樹時也提到了平衡二叉樹,紅黑樹和AVL樹都是能保證樹不退化的平衡二叉樹,平衡二叉樹采用二分思想組織數據,能大大提高單點查找數據的效率,其組裝過程略。

作為對比,此處也列出平衡二叉樹規則

  1. 節點最多有兩個子節點。
  2. 節點大於其左子節點小於其右子節點。
  3. 樹的左右兩邊層級最多相差不大於1。

但平衡二叉樹的性能和層級成反比,如果層級過多,則影響效率。因此數據庫使用平衡二叉樹組織數據過於低效,產生了B樹。

B樹

結構

B樹即多路平衡查找樹,也叫多叉樹,其規則如下:

  1. 遞增排序,左小右大。
  2. 一個節點的子節點數在(1,m]且m>=2。
  3. 一個節點的關鍵字數量為[(m-1)/2,m)。
  4. 所有葉子節點在同層。

查詢

由於B樹采用左小右大的原則,可以快速定位數據所在的區間,能夠快速定位到單點。

插入

  1. 根據區間正常插入到葉子節點。
  2. 所在節點元素數超過m-1時,拆分,中間元素提到父節點,左邊元素構成一個葉子節點,右邊元素構成一個葉子節點。若引起父節點溢出,則遞歸拆分。

刪除

  1. 根據區間正常定位到關鍵字,刪除。
  2. 所在節點元素數小於(m-1)/2,從子節點取點補缺,若子節點沒有可取點,則從父節點取點補缺,若引起父節點元素數不足,遞歸此問題。

除了有效減少數據的層數時,B樹可以把塊大小設置為4k,這樣和磁盤塊大小相同,可以快速將一個節點的數據全部取出,提高了性能。

B+樹

相對於B樹,B+樹將所有元素都存儲到葉子節點,非葉子節點保存的是葉子節點首條數據的引用,用於檢索,因此B+樹的葉子節點數=關鍵字數。此外,B+樹的每個葉子節點,都包含着指向相鄰葉子節點的指針。

B+樹的插入和B樹幾乎一致,只是拆分時不會將元素提到葉子節點,而是將元素的引用提到葉子節點(左節點包含m/2個元素),並遞歸拆分。

刪除時,若刪除后節點元素不足,優先從兄弟節點借一個元素,並更新父節點的引用。若兄弟節點不能借出節點,則將兩節點合並為同一節點,並更新父節點引用。引起父節點元素不足時,遞歸操作,當根節點只有一個子節點時則進行降級,引用下移並刪除節點。

B+樹有以下好處:

  1. B+樹非葉子節點僅存儲引用,相對很小,一次性讀入內存的關鍵字多(類似KV分離的好處)。
  2. B+樹所有元素都在葉子節點,查詢效率穩定。
  3. 葉子節點指向相鄰兄弟節點,可以快速scan。

B*樹

B樹在B+樹基礎上,將非葉子節點也加上指向兄弟節點的指針,並定義非葉子節點關鍵字個數至少為(2/3)m,進而獲取了更高的空間利用率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM