SQL 技巧:B+樹索引結構解析

一、二分查找法

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

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

  如有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次。

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

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

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

  二叉查找樹中定義:左子樹的鍵值總是小於根的鍵值,右子樹的鍵值總是大於根的鍵值。因此可以通過中序遍歷得到鍵值的排序輸出

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

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

  平衡二叉樹的查詢速度很快,但是維護一顆平衡二叉樹的代價很大,通常來說,需要1次或多次左旋和右旋來得到插入或更新後樹的平衡性。如下所示:

  

  

三、B+樹

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

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

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

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

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

 

四、B+樹的插入操作

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

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

  

                     圖(1)

  

                    圖(2)

   2、從上圖接着插入70這個鍵值,這時原來的leafPage已經滿了,但是IndexPage還沒有。這時插入leafPage後的情況爲50、55、60、65、70,並根據中間值60來拆分葉子節點,可得下圖。

  

                      圖(3)

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

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

 

                    圖(4)

  3、最後插入95,這時複合第三種情況,即leafPage和IndexPage都滿了,這時需要做兩次拆分

  

                   圖(5)

五、B+樹的刪除操作

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

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

  

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

    

 

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

  

 

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

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章