B+ 樹簡介
B+ 樹是基於 B-樹的變體,比 B-樹查詢性能更強
什麼是衛星數據
衛星數據就是索引元素指向的數據記錄,就是索引指向的是數據庫表中哪一行,對於 B-樹來說每個結點都有衛星數據,對於 B+ 樹來說只有葉子結點有衛星數據
聚集索引和非聚集索引
數據庫錶行中是物理順序和鍵值的邏輯順序相同,非聚集索引反之。對於聚集索引,B+ 樹的葉子結點直接包含了衛星數據,對於非聚集索引,B+ 樹的葉子結點帶有指向衛星數據的指針
爲什麼 B+ 樹比 B 樹更優秀?
-
更少的 IO 次數
B+ 樹的非葉子結點沒有衛星數據,所以各個磁盤頁理論上能存放更多的索引,換句話說就是下面規則中的 k 的值會比 B 樹更大,k 本來是 B+ 樹的階數,k 是依據磁盤頁的大小來定的,現在磁盤頁給 B+ 樹使用時可以存更多索引,那麼 B+ 樹相對於 B 樹來講,相同磁盤頁,這個 k 的值可以取更大。在樹的圖形中可以表現爲,B+ 樹比 B 樹更加矮胖
-
性能更穩定
B+ 樹每次查找都會找到葉子結點(因爲只有葉子結點包含衛星數據的相關信息),而 B 樹就不是,B 有時候會找到葉子結點,有時候只找到中間結點就不找了,B+ 樹查找性能上比 B 樹要穩定
-
範圍查詢更簡單
在範圍查詢時候,若查詢 a-b 索引的數據,B 樹需要做中序遍歷,B+ 樹只需要在結點鏈表上做遍歷就行了
B+ 樹規則
- 1.有k個子樹的中間節點包含有k個元素(B樹中是k-1個元素),每個元素不保存數據,只用來索引,所有數據都保存在葉子節點
- 2.所有的葉子結點中包含了全部元素的信息,及指向含這些元素記錄的指針,且葉子結點本身依關鍵字的大小自小而大順序鏈接
- 3.每一個父節點中的元素會出現在所有子結點中,且是子結點的最大(最小值)
B+ 樹應用
mysql 使用 B+ 樹作索引