當數據量大時,我們如果用二叉樹來存儲的會導致樹的高度太高,從而造成磁盤IO過於頻繁,進而導致查詢效率下降。因此采用B樹來解決大數據存儲的問題,很多數據庫中都是采用B樹或者B+樹來進行存儲的。其目的就是減少磁盤IO,提高查詢效率。
B樹特性
B樹中每個節點可以有多個關鍵字,並且每個節點可以有多個孩子。具體特性如下:
- B樹中所有節點的孩子節點數中的最大值稱為B樹的階,記為M
- 樹中的每個節點至多有M棵子樹
- 若根節點不是終端節點,則至少有兩棵子樹
- 除根節點外所有非葉節點至少有m/2棵子樹
- 所有非葉節點結構如下
n | P0 | K1 | P1 | K2 | P2 | … | Kn | Pn |
其中,n為節點中關鍵字的個數,Ki(i=1,2,3…n)為節點的關鍵字,且滿足K1<K2<…<Kn;Pi(i=0,1,…,n)為指向子節點的指針,且Pi-1指向的節點中所有的關鍵字都小於Ki,Pi指向的節點中所有的關鍵字都要小於Ki。比如:P1指向的節點中所有的關鍵字都要小於大於K1且小於K2
- 所有的葉節點需要出現在同一層次上
- 樹中所有節點的平衡因子都等於0
三階B樹
B樹的查找
在B樹上進行查找和二叉樹的查找很相似,二叉樹是每個節點上有一個關鍵子和兩個分支。B樹上每個節點有K個關鍵字和K+1個分支。二叉樹的查找只考慮向左還是向右走,而B樹中需要由多個分支決定。
B樹的查找分兩步,首先查找節點,由於B樹通常是在磁盤上存儲的所以這步需要進行磁盤IO操作。第二步是查找關鍵字,當找到某個節點后將該節點讀入內存中然后通過順序或者折半查找來查找關鍵字。若沒有找到關鍵字,則需要判斷大小來找到合適的分支繼續查找。
B樹的插入
B樹的插入過程比較復雜,具體分為以下幾個步驟:
- 定位:利用B樹的查找算法,找出插入該關鍵字的最底層的某個葉子節點。
- 插入:找到欲插入的節點后,先進行插入操作。然后進行判斷,如果當前節點中關鍵子的數量小於等於M-1(M為樹的階,即一個節點最多有3棵子樹,那么該節點最多有兩個關鍵字),則表示插入成功。否側對節點進行分列處理
- 分裂方法:創建一個新節點,將插入KEY后的原節點從中間位置將其中的關鍵字分為兩部分,左邊的一部分保留在原節點中,右部分包含的關鍵字放到新的節點中,中間位置(m/2取上限)的節點插入到原節點的父節點中去。若此時導致其父節點的關鍵字個數也超過了上限,則繼續進行這種分裂操作,直到這個過程傳到根節點為止。
下面是一個三階B樹的插入過程。
當插入一個關鍵字60后,節點內的關鍵字個數超過出了m-1=2,此時必須進行節點分裂,分裂的過程如上圖所示。