1、MySQL Index 的插入
有以下B+樹,其高度爲2,每頁可存放4條記錄,扇出爲5。全部記錄都在葉子節點上,spa
而且是順序存放,若是用戶從最左邊的葉子節點開始順序遍歷,能夠獲得全部簡直的順序3d
排序:五、十、1五、20、2五、30、50、5五、60、6五、7五、80、8五、90。blog
B+樹的插入操做,分爲三種狀況
一、Leaf Page和Index Page都沒滿
用戶插入28這個值,Leaf Page和Index Page都沒滿,直接插入便可排序
二、Leaf Page已經滿了,Index Page沒有滿
用戶插入70這個值,Leaf Page已經滿了,Index Page沒有滿。繼承
這是插入Leaf Page後狀況爲50、5五、60、6五、70,並根據中間值60來拆分葉節點。索引
三、Leaf Page和Index Page都滿了
插入95這個值,Leaf Page和Index Page都滿了,這是須要兩次拆分io
1)首先插入Leaf Page後狀況爲7五、80、8五、90、95,因爲Leaf Page已經滿了,須要根據中間值85拆分葉節點,小於85的放左邊即7五、80;class
大於等於85的放右邊即8五、90、95。二叉樹
2)將中間節點85放入Index Page後,Index Page的值爲2五、50、60、7五、85,因爲Index Page也滿了,須要拆分Index Page,取中間值60,遍歷
放入上層Index Page中,小於60的2五、50放在左邊;大於60的值7五、85放在右邊。
四、B+樹的旋轉(繼承平衡二叉樹的旋轉功能)
無論怎麼變化B+樹老是保持平衡。可是爲了保持平衡杜宇先插入的鍵值可能須要作大量的拆分操做。由於B+樹結構主要用於磁盤,頁的拆分意味着磁盤操做,因此應該在可能的狀況下儘可能減小頁的拆分操做。所以,B+樹一樣提供了相似平衡二叉樹的旋轉(Rotation)功能。
旋轉發生在Leaf Page已滿,其左右兄弟沒滿的狀況下。B+樹不急於作拆分,一般狀況下左兄弟會被首先檢查用來作旋轉操做。
插入鍵值70,其實B+樹並不會急於去拆分葉子節點,而是去作旋轉操做,獲得如圖
採用旋轉操做使得B+樹減小了一次頁的拆分操做,同時B+樹的高度依然是2。
2、MySQL Index 的刪除
B+樹使用填充因子(fill factor)來控制樹的刪除變化,50%是填充因子能夠設置的最小值。B+樹的刪除操做一樣必須保證刪除後葉子節點中的記錄依然排序,同插入同樣,B+樹的刪除操做一樣有三種狀況,與插入不一樣的是,刪除時根據填充因子的變化衡量。
一、葉子節點大於填充因子、中間節點大於填充因子
1)刪除鍵值爲70的這條記錄,該記錄符合第一種狀況,刪除後可得下圖
2)接着5-11,再刪除鍵值爲25的記錄,這也是討論的第一種狀況,可是該值是Index Page中的值,所以在刪除Leaf Page中的25後,還應該將25的兄弟節點的28更新到Page Index中。
二、葉子節點小於填充因子、中間節點大於填充因子
三、葉子節點小於填充因子、中間節點小於填充因子
最後刪除鍵值60的狀況。刪除Leaf Page中鍵值爲60的記錄後,Fill Factor小於50%,這時須要作合併操做,一樣,再刪除Index Page中相關記錄後,須要作Index Page的合併操做,最後如圖
3、一些概念
一、索引扇出
扇出:是指該模塊直接調用的下級模塊的個數。扇出大表示模塊的複雜度高,須要控制和協調過多的下級模塊;但扇出太小(例如老是1)也很差。
扇出過大通常是由於缺少中間層次,應該適當增長中間層次的模塊。扇出過小時能夠把下級模塊進一步分解成若干個子功能模塊,或者合併到它的上級模塊中去。
二、索引填充因子
和索引重建最相關的是填充因子。當建立一個新索引,或重建一個存在的索引時,你能夠指定一個填充因子,它是在索引建立時索引裏的數據頁被填充的數量。填充因子設置爲100意味着每一個索引頁100%填滿,50%意味着每一個索引頁50%填滿。若是你建立一個填充因子爲100的彙集索引(在一個非單調遞增的列上),那意味着每當一個記錄被插入(或修改)時,頁拆分都會發生,由於在現存的頁上沒有這些數據的空間。