B+樹介紹

B+樹

B+樹和二叉樹、平衡二叉樹同樣,都是經典的數據結構。B+樹由B樹索引順序訪問方法(ISAM,是否是很熟悉?對,這也是MyISAM引擎最初參考的數據結構)演化而來,可是在實際使用過程當中幾乎已經沒有使用B樹的狀況了。算法

B+樹的定義十分複雜,所以只簡要地介紹B+樹:B+樹是爲磁盤其餘直接存取輔助設備而設計的一種平衡查找樹,在B+樹中,全部記錄節點都是按鍵值的大小順序存放在同一層的葉節點中,各葉節點指針進行鏈接數據結構

咱們先來看一個B+樹,其高度爲2,每頁可存放4條記錄,扇出(fan out)爲5。spa

能夠看出,全部記錄都在葉節點中,而且是順序存放的,若是咱們從最左邊的葉節點開始順序遍歷,能夠獲得全部鍵值的順序排序:五、十、1五、20、2五、30、50、5五、60、6五、7五、80、8五、90。設計

B+樹的插入操做

B+樹的插入必須保證插入後葉節點中的記錄依然排序,同時須要考慮插入B+樹的三種狀況,每種狀況均可能會致使不一樣的插入算法,如表5-1所示。 3d

咱們用實例來分析B+樹的插入,咱們插入28這個鍵值,發現當前Leaf Page和Index Page都沒有滿,咱們直接插入就能夠了。指針

此次咱們再插入一條70這個鍵值,這時原先的Leaf Page已經滿了,可是Index Page尚未滿,符合表5-1的第二種狀況,這時插入Leaf Page後的狀況爲50、5五、60、6五、70。咱們根據中間的值60拆分葉節點。blog

由於圖片顯示的關係,此次我沒有能在各葉節點加上雙向鏈表指針。最後咱們來插入記錄95,這時符合表5-1討論的第三種狀況,即Leaf Page和Index Page都滿了,這時須要作兩次拆分。排序

 

能夠看到,無論怎麼變化,B+樹老是會保持平衡。可是爲了保持平衡,對於新插入的鍵值可能須要作大量的拆分頁(split)操做,而B+樹主要用於磁盤,所以頁的拆分意味着磁盤的操做,應該在可能的狀況下儘可能減小頁的拆分。所以,B+樹提供了旋轉(rotation)的功能。索引

旋轉發生在Leaf Page已經滿了、可是其左右兄弟節點沒有滿的狀況下。這時B+樹並不會急於去作拆分頁的操做,而是將記錄移到所在頁的兄弟節點上。一般狀況下,左兄弟被首先檢查用來作旋轉操做,這時咱們插入鍵值70,其實B+樹並不會急於去拆分葉節點,而是作旋轉,50,55,55旋轉。圖片

 

能夠看到,採用旋轉操做使B+樹減小了一次頁的拆分操做,而這時B+樹的高度依然仍是2。

B+樹的刪除操做

B+樹使用填充因子(fill factor)來控制樹的刪除變化,50%是填充因子可設的最小值。B+樹的刪除操做一樣必須保證刪除後葉節點中的記錄依然排序,同插入同樣,B+樹的刪除操做一樣須要考慮如表5-2所示的三種狀況,與插入不一樣的是,刪除根據填充因子的變化來衡量。 

首先,刪除鍵值爲70的這條記錄,該記錄符合表5-2討論的第一種狀況,刪除後。

接着咱們刪除鍵值爲25的記錄,這也是表5-2討論的第一種狀況,可是該值仍是Index Page中的值,所以在刪除Leaf Page中25的值後,還應將25的右兄弟節點的28更新到Page Index中,最後可獲得圖。

最後咱們來看刪除鍵值爲60的狀況,刪除Leaf Page中鍵值爲60的記錄後,填充因子小於50%,這時須要作合併操做,一樣,在刪除Index Page中相關記錄後須要作Index Page的合併操做,最後獲得圖。

相關文章
相關標籤/搜索