這是數據庫索引相關內容的第二篇
複製代碼
B樹
目錄:數據庫
- 什麼是B樹
- B樹的最小度數
- B樹的高度
- 什麼狀況下使用B樹
- B樹的插入
- B樹的刪除
關於1~4已經在上一節介紹過了B樹是個什麼玩意post
這裏重點介紹B樹的插入優化
5. B樹的插入spa
B樹要保持它的平衡及最小度數(t-1=<n<=2t-1, t<=child<=2t)特性,則須要在插入之後也是一個知足此特性的B樹。3d
那麼若是是你,如何保證在插入關鍵字後,新的B樹也能知足其特性呢?code
通常的思路是:cdn
- 根據B樹的排序特性,找到插入的節點
- 若是插入的節點是不滿的(n<2t-1),直接插入
- 若是插入的節點是滿的(n=2t-1),則不能直接插入,由於插入之後,就不符合B樹的特徵了,咱們要一直維護B樹的特徵, n<=2t-1,因此須要將節點進行拆分;
- 節點拆分後,若是隻是單純的拆分,一個child的裂變成兩個,顯然這麼簡單的裂變是不行的,由於child+1了,可是父節點的關鍵字個數n沒變,因此不符合child = n+1,子節點多裂變了一個,可是父節點沒變;
- 因此節點拆分後,須要將中間的數據,提到父節點中;
- 可是若是父節點是滿的,子節點提到父節點中又不知足B樹的特性了,父節點也要裂變,提一個到父父節點中;
- 若是父父節點是滿的,則又周而復始....
因此這將是個從上到下查找,又從下到上裂變的過程。blog
雖然這也能夠實現,可是有沒有優化的方法?排序
- 觀察一下這個過程,自己定位到插入節點時,已經有一次至上到下的過程了;
- 若是在至上而下的過程當中,每發現滿的節點,就進行拆分呢,是否是就能夠作到一次向下查找,就能知足後續的插入裂變。
是的,這就是B樹的插入過程!索引
- 至上而下查找
- 每發現滿節點,就進行裂變
- 找到插入位置,插入,若是須要裂變,就裂變,由於父節點不多是滿的,再剛剛遍歷到父節點的時候,已經提早騰出空間了!
就是這麼簡單!
讓咱們來看個例子:
有以下字母:F, S, Q, K, C, L, H, T, V
- 假設如今有個空樹
- 假設t = 2, 即最小度數爲2;
- 請畫出B樹的插入過程(只畫出關鍵過程)
解答:
- t = 2,意味着咱們節點的關鍵字個數在1~3之間,一單關鍵字個數超過3,則要裂變
- 在依次插入F,S,Q時,很簡單,由於根節點<=3
- 當插入K時,自上而下的過程當中,發現父節點是滿的,必然要先拆分父節點
- 此時父節點已經被成功拆分紅不滿的節點,而且子節點個數和排序也符合B樹要求
- 插入K,好比是從Q向左查找,插入到F以後。
- 接着要插入C,直接插入的到F以前就行,由於在至頂向下的過程當中,沒有發現滿節點
- 好了,下面到L了,當至頂向下的過程當中,L是在Q左側查找,發現了CFK節點是滿的,必然進行拆分; 將中間節點F提上來,父節點個數+1,子節點個數+1, 仍然符合B樹特徵
- 拆分以後,插入L
後續的插入,就不用多講了,重複以上過程。
好了,寫的真累,刪除下次再寫吧
其餘相關章節
複製代碼
數據庫索引相關文章之一:《B樹,一點都不神祕》
數據庫索引相關文章之二:《B樹很簡單,插入so easy》
數據庫索引相關文章之三:《索引》
數據庫索引相關文章之四:《什麼索引算是好的索引》
數據庫索引相關文章之五:《如何發現及替換不合適的索引》
數據庫索引相關文章之六:《索引總結》