資料庫索引為什麼使用B+樹?

weixin_33890499發表於2017-12-29

概述

B tree: 二叉樹(Binary tree),每個節點只能儲存一個數。
B-tree:B樹(B-Tree,並不是B“減”樹,橫槓為連線符,容易被誤導)
B樹屬於多叉樹又名平衡多路查詢樹。每個節點可以多個數(由磁碟大小決定)。
B+treeB*tree 都是 B-tree的變種

索引為什麼是用B樹呢?

一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查詢過程中就要產生磁碟I/O消耗,相對於記憶體存取,I/O存取的消耗要高几個數量級,所以評價一個資料結構作為索引的優劣最重要的指標就是在查詢過程中磁碟I/O操作次數的漸進複雜度。換句話說,索引的結構組織要儘量減少查詢過程中磁碟I/O的存取次數。而B-/+/*Tree,經過改進可以有效的利用系統對磁碟的塊讀取特性,在讀取相同磁碟塊的同時,儘可能多的載入索引資料,來提高索引命中效率,從而達到減少磁碟IO的讀取次數。

不瞭解磁碟相關知識的可以檢視 硬碟基本知識(磁頭、磁軌、扇區、柱面)

下面通過示意圖來看一下,B-tree、B+tree、B*tree

B-tree

2843224-acd7f365752c059d.png
B-樹

從圖中可以看出,B-tree 利用了磁碟塊的特性進行構建的樹。每個磁碟塊一個節點,每個節點包含了很關鍵字。把樹的節點關鍵字增多後樹的層級比原來的二叉樹少了,減少資料查詢的次數和複雜度。

B-tree巧妙利用了磁碟預讀原理,將一個節點的大小設為等於一個頁(每頁為4K),這樣每個節點只需要一次I/O就可以完全載入。
B-tree 的資料可以存在任何節點中。

B+tree

2843224-c2bc8a92ea278ec7.png
B+樹

B+tree 是 B-tree 的變種,資料只能儲存在葉子節點。

B+tree 是 B-tree 的變種,B+tree 資料只儲存在葉子節點中。這樣在B樹的基礎上每個節點儲存的關鍵字數更多,樹的層級更少所以查詢資料更快,所有指關鍵字指標都存在葉子節點,所以每次查詢的次數都相同所以查詢速度更穩定;

如果每個節點能存放M個資料,每個節點的資料在M/2到M之間。預留出空間可以插入新的資料。

B*tree

2843224-bdde131b5cbb1008.png
B*樹

B*tree 每個磁碟塊中又新增了對下一個磁碟塊的引用。這樣可以在當前磁碟塊滿時,不用擴容直接儲存到下一個臨近磁碟塊中。當兩個鄰近的磁碟塊都滿時,這兩個磁碟塊各分出1/3的資料重新分配一個磁碟塊,這樣這三個磁碟塊的資料都為2/3。

如果每個節點能存放M個資料,每個節點的資料在2M/3到M之間。預留出空間可以插入新的資料。

在B+樹的基礎上因其初始化的容量變大,使得節點空間使用率更高,而又存有兄弟節點的指標,可以向兄弟節點轉移關鍵字的特性使得B*樹額分解次數變得更少;


想了解更多精彩內容請關注我的公眾號

2843224-af50fe51e979ebd0.png

相關文章