B+樹索引結構解析

1、二分查找法

  二分查找法(binary search)也成爲折半查找法。用來查找一組有序的記錄組中的某一記錄。算法

  基本思想是:將記錄按有序化(遞增或遞減)排列,在查找過程當中採用跳躍式方法查找,即先以有序數列的中點位置爲比較對象,若是要找的元素值小於該中點元素,則將待查詢列縮小爲左半部分,不然爲右半部分。經過一次比較,將查詢區間縮小一半。markdown

  若有5,10,19,21,31,37,42,48,50,52這10個數,要查48這個數,其查找過程:數據結構

  

  從圖看,用了3次就找到了48這個數。若是是順序查找,則須要8次,所以二分查找法的效率比順序查找法要好(平均)。可是若是要查5這個數,順序查只需1次,而二分查找須要4次。性能

  對於上面的10個數來講,平均查找次數爲(1+2+3+4+5+6+7+8+9+10)/10=5.5次。而二分查找爲(4+3+2+4+3+1+4+3+2+3)/10=2.9次。spa

  在最壞的狀況下,順序查找的次數爲10,而二分查找法爲4設計

2、二叉查找樹和平衡二叉樹

  B+樹是經過二叉查找樹,再由平衡二叉樹,B樹演化而來。3d

  二叉查找樹中定義:左子樹的鍵值老是小於根的鍵值,右子樹的鍵值老是大於根的鍵值。所以能夠經過中序遍歷獲得鍵值的排序輸出指針

  若想最大性能的構造一顆二叉查找樹,須要這顆二叉查找樹是平衡,從而引出了新的定義-----平衡二叉樹,或稱爲AVL樹。code

  平衡二叉樹定義首先複合二叉查找樹的定義,其次必須知足任何節點的兩個子樹的高度最大差爲1.orm

  平衡二叉樹的查詢速度很快,可是維護一顆平衡二叉樹的代價很大,一般來講,須要1次或屢次左旋和右旋來獲得插入或更新後樹的平衡性。以下所示:

  

  

3、B+樹

  B+樹和二叉樹、平衡二叉樹同樣都是經典的數據結構。

  B+樹由B樹和索引順序訪問方法(ISAM,這就是MyISAM引擎最初參考的數據結構)演化而來,實際中已經沒有使用B樹的狀況了。

  B+樹是爲磁盤或其餘直接存儲輔助設備設計的一種平衡查找時。

  B+樹中,全部記錄節點都是按鍵值的大小順序存放在同一層的葉子節點上,由各葉子節點指針進行鏈接。

  以下:其高度爲2,每頁存放4條記錄,扇出(fan out)爲5。全部記錄都在葉子節點上,而且是順序存放的。

 

4、B+樹的插入操做

  B+樹的插入必須保證插入後葉子節點中的記錄依然排序,同時須要考慮插入到B+樹的三種狀況,每種狀況都會致使不一樣的插入算法。以下所示:

  一、以下圖這顆B+樹,若用戶插入28這個值,發現當前葉子頁leafPage和IndexPage索引頁都沒有滿,直接插入就行。

  

                     圖(1)

  

                    圖(2)

   二、從上圖接着插入70這個鍵值,這時原來的leafPage已經滿了,可是IndexPage尚未。這時插入leafPage後的狀況爲50、5五、60、6五、70,並根據中間值60來拆分葉子節點,可得下圖。

  

                      圖(3)

   爲了保持平衡對於新插入的鍵值可能須要作大量的拆分頁(split)操做。由於B+樹結構主要用於磁盤,也拆分意味着磁盤操做,因此應該在可能的狀況下儘可能減少頁的拆分操做。所以B+樹會提出平衡二叉樹的旋轉(Rotation)功能。

  旋轉發生在leafPage已滿,可是其左右兄弟節點沒有滿的狀況下。這時B+樹不會急於去拆分頁操做,而是將記錄移到所在頁的兄弟頁節點上,一般狀況下,左兄弟會被首先檢查用來作旋轉操做。若如此,插入70應該左旋爲:

 

                    圖(4)

  三、最後插入95,這時複合第三種狀況,即leafPage和IndexPage都滿了,這時須要作兩次拆分

  

                   圖(5)

5、B+樹的刪除操做

  B+樹使用填充因子(fill factor)來控制樹的刪除變化,50%是填充因子可設的最小值。

  B+樹的刪除操做一樣必須保證刪除後葉子節點中的記錄依然排序,同插入同樣,B+樹刪除操做一樣須要考慮如下三種狀況:

  

  一、根據圖(5)的B+樹來進行刪除。首先刪除鍵值爲70的記錄:

    

 

   接着刪除鍵值爲25的記錄,可是該值仍是IndexPage中的值,所以在刪除LeafPage中的25後,還應將25的右兄弟節點28更新到PageIndex中,如圖:

  

 

   最後刪除60這個鍵值。刪除LeafPage中鍵值爲60的記錄後,Fill Factor小於50%,這時須要作合併操做,一樣,在刪除IndexPage中相關記錄後須要作IndexPage的合併操做。

   

相關文章
相關標籤/搜索