MYSQL 索引為什么使用B+樹,而不是 B 樹,二叉樹:

如何評價索引的好壞:

數(shù)據(jù)庫服務器有兩種存儲介質(zhì),硬盤和內(nèi)存,為了數(shù)據(jù)安全,索引需要存放在硬盤上,這樣在硬盤上進行查詢時,就會產(chǎn)生硬盤的I/O操作,索引的查找次數(shù)也就是硬盤I/O的操作次數(shù),所以索引需要減少硬盤的I/O操作。

  1. 二叉樹:

普通農(nóng)的二分查找樹,有可能退化成一條鏈表,這是查找數(shù)據(jù)的時間復雜度為 O(n)。

為此,有平衡二叉搜索樹(AVL樹, 樹堆,紅黑樹、伸展樹等)搜索時間復雜度是 O(log2n)。

對于 數(shù)據(jù)庫索引來說,O(log2n)仍然太大。

  1. B樹:
image.png

Balance Tree,平衡的多路搜索樹,即 每個節(jié)點不再是只有2個子節(jié)點,而是有M個子節(jié)點,它的高度遠小于平衡二叉樹的高度。

B樹的每個節(jié)點最多包含M個子節(jié)點,M成為B樹的階。每個磁盤塊中包括了關鍵字和子節(jié)點的指針。如果一個磁盤塊中包括了x 個關鍵字,那么指針數(shù)就是x + 1.對于一個100階的B樹來說,如果3層的話,最多可以存儲約100萬的索引數(shù)據(jù)。

l 根節(jié)點的兒子樹的范圍是 [2, M]

l 每個中間節(jié)點包含 k – 1個關鍵字和 k 個孩子,孩子的數(shù)量 = 關鍵字的數(shù)量 + 1, k 的取值范圍為[ceil(M/2), M]

l 葉子節(jié)點包括 k – 1 個關鍵字(葉子結點沒有孩子)。

l 每個 關鍵字 key,劃分了一個數(shù)據(jù)范圍,也就是子節(jié)點的數(shù)據(jù)范圍。

l 所有葉子節(jié)點位于同一層。

在B樹的搜索過程中,比較的次數(shù)并不少,可以把數(shù)據(jù)讀取出來,然后在內(nèi)存中比較,這樣相比于平衡二叉樹來說,磁盤I/O操作要少,在數(shù)據(jù)查詢中比平衡二叉樹效率要高。

  1. B+ 樹:

B+ 樹對 B樹做了改進:

l 有k個孩子的節(jié)點就有k個關鍵字,也就是孩子數(shù)量=關鍵字數(shù)量。

l 非葉子節(jié)點的關鍵字也會同時存在于子節(jié)點中,并且是在子節(jié)點中所有關鍵字的最大(或最?。?/p>

l 非葉子節(jié)點僅用于索引,不保存數(shù)據(jù)記錄,跟記錄有關的信息都放在葉子結點中,而在B樹中,非葉子節(jié)點既保存索引,也保存數(shù)據(jù)記錄。

l 所有關鍵字都在葉子節(jié)點出現(xiàn),葉子節(jié)點構成一個有序鏈表,而且葉子節(jié)點本身按照關鍵字的大小從小到大順序鏈接。


image.png
  1. B 樹相對于 二叉樹,更加矮胖,可以減少查找次數(shù)(I/O次數(shù));

B+ 樹相對于 B樹,由于數(shù)據(jù)都在葉子節(jié)點當中,所以可以把索引一次性加載到內(nèi)存中,減少I/O次數(shù);同時由于葉子節(jié)點是一個有序鏈表,可以加快關鍵字的范圍查詢。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容