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

2021-09-05 09:33:20 字數 1522 閱讀 7164

b tree:二叉樹(binary tree),每個節點只能儲存乙個數。

b-tree:b樹(b-tree,並不是b「減」樹,橫槓為連線符,容易被誤導)

b樹屬於多叉樹又名平衡多路查詢樹。每個節點可以多個數(由磁碟大小決定)。

b+treeb*tree都是 b-tree的變種

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

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

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

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

b-tree巧妙利用了磁碟預讀原理,將乙個節點的大小設為等於乙個頁(每頁為4k),這樣每個節點只需要一次i/o就可以完全載入。

b-tree 的資料可以存在任何節點中。

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

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

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

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

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

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

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

首先,紅黑樹乙個節點存乙個索引,雖然能提公升查詢的效率,但是o log2 n 的優化有限,對於大量資料而言,樹高決定了io的次數還是比較多 b 樹相比b樹,非葉子節點只存索引和下一節點指標,而少了關鍵字具體資訊的指標,所以節點比較小。在一次io操作下,讀取到的資料塊中,索引key更多,相對來說,進行...

資料庫索引為什麼B樹結構

這是乙個很深的問題,我採用逐步問答的方式來解答。試圖用最簡潔的語言解決整體概念上的問題。本文目的純粹是提供對 索引採用b樹結構 這個問題的一種入門概念,不涉及深入的東西。資料庫索引為什麼會選擇b樹結構?答 因為使用b樹查詢時,所用的磁碟io操作次數比平衡二叉樹更少,效率也更高。為什麼使用b樹查詢所用...

MySQL索引為什麼選擇B 樹而不是B樹

b類樹的特點,b類樹保證盡量多的在結點上儲存相關的資訊,同時保證層數盡量的少,查詢更快,磁碟的io操作也少一些。b 樹的io更少 b 樹的非葉子節點沒有指向關鍵字具體資訊的指標,只用作索引,因此b 樹的非葉子節點比b樹占用更少磁碟空間。當資料量大時,一次不能把整個索引全部載入到記憶體,只能逐個載入每...