什麼是B-Tree

  B-Tree就是咱們常說的B樹,必定不要讀成B減樹,不然就很丟人了。B樹這種數據結構經常用於實現數據庫索引,由於它的查找效率比較高。數據庫

磁盤IO與預讀

磁盤讀取依靠的是機械運動,分爲尋道時間、旋轉延遲、傳輸時間三個部分,這三個部分耗時相加就是一次磁盤IO的時間,大概9ms左右。這個成本是訪問內存的十萬倍左右;正是因爲磁盤IO是很是昂貴的操做,因此計算機操做系統對此作了優化:預讀;每一次IO時,不只僅把當前磁盤地址的數據加載到內存,同時也把相鄰數據也加載到內存緩衝區中。由於局部預讀原理說明:當訪問一個地址數據的時候,與其相鄰的數據很快也會被訪問到。每次磁盤IO讀取的數據咱們稱之爲一頁(page)。一頁的大小與操做系統有關,通常爲4k或者8k。這也就意味着讀取一頁內數據的時候,實際上發生了一次磁盤IO。數據結構

B-Tree與二叉查找樹的對比

  咱們知道二叉查找樹查詢的時間複雜度是O(logN),查找速度最快和比較次數最少,既然性能已經如此優秀,但爲何實現索引是使用B-Tree而不是二叉查找樹,關鍵因素是磁盤IO的次數性能

數據庫索引是存儲在磁盤上,當表中的數據量比較大時,索引的大小也跟着增加,達到幾個G甚至更多。當咱們利用索引進行查詢的時候,不可能把索引所有加載到內存中,只能逐一加載每一個磁盤頁,這裏的磁盤頁就對應索引樹的節點。優化

1、 二叉樹

咱們先來看二叉樹查找時磁盤IO的次:定義一個樹高爲4的二叉樹,查找值爲10:spa

                                                            

 

第一次磁盤IO:操作系統

                         

 

 

 第二次磁盤IO3d

                           

 

第三次磁盤IO:blog

                             

 

第四次磁盤IO:索引

                                   

從二叉樹的查找過程了來看,樹的高度和磁盤IO的次數都是4,因此最壞的狀況下磁盤IO的次數由樹的高度來決定。內存

從前面分析狀況來看,減小磁盤IO的次數就必需要壓縮樹的高度,讓瘦高的樹儘可能變成矮胖的樹,因此B-Tree就在這樣偉大的時代背景下誕生了。

2、B-Tree

m階B-Tree知足如下條件:

一、每一個節點最多擁有m個子樹

二、根節點至少有2個子樹

三、分支節點至少擁有m/2顆子樹(除根節點和葉子節點外都是分支節點)

四、全部葉子節點都在同一層、每一個節點最多能夠有m-1個key,而且以升序排列

 以下有一個3階的B樹,觀察查找元素21的過程:

                                                                              

第一次磁盤IO:     

                                                           

第二次磁盤IO:

                                                  

這裏有一次內存比對:分別跟3與12比對

第三次磁盤IO:

                                                     

這裏有一次內存比對,分別跟14與21比對

從查找過程當中發現,B樹的比對次數和磁盤IO的次數與二叉樹相差不了多少,因此這樣看來並無什麼優點。

可是仔細一看會發現,比對是在內存中完成中,不涉及到磁盤IO,耗時能夠忽略不計。另外B樹種一個節點中能夠存放不少的key(個數由樹階決定)。

相同數量的key在B樹中生成的節點要遠遠少於二叉樹中的節點,相差的節點數量就等同於磁盤IO的次數。這樣到達必定數量後,性能的差別就顯現出來了。

 3、B樹的新增

在剛纔的基礎上新增元素4,它應該在3與9之間:

                                 

                                     

                                     

 

4、B樹的刪除

 刪除元素9:

                                  

 

                                    

5、總結

  插入或者刪除元素都會致使節點發生裂變反應,有時候會很是麻煩,但正由於如此才讓B樹可以始終保持多路平衡,這也是B樹自身的一個優點:自平衡;B樹主要應用於文件系統以及部分數據庫索引,如MongoDB,大部分關係型數據庫索引則是使用B+樹實現。

相關文章
相關標籤/搜索