Mysql - 索引為什么使用B+樹而不是B樹


索引在計算機中的位置

一般來說,索引本身也很大,不可能全部存儲在內存中,一般以文件形式存儲在磁盤上,索引檢索需要磁盤I/O操作。判斷一種數據結構作為索引的優劣主要是看在查詢過程中的磁盤IO漸進復雜度,一個好的索引應該是盡量減少磁盤IO操作次數

為什么使用B+樹

1、B樹只適合隨機檢索,而B+樹同時支持隨機檢索和順序檢索;
2、B+樹空間利用率更高

因為B+樹的內部節點(非葉子節點,也稱索引節點不存儲數據,只存儲索引值,相比較B樹來說,B+樹一個節點可存儲更多的索引值,使得整顆B+樹變得更矮,減少I/O次數,磁盤讀寫代價更低,I/O讀寫次數是影響索引檢索效率的最大因素;
3、B+樹查詢效率更加穩定

因為在B+樹中,順序檢索比較明顯,隨機檢索時,由於B+樹所有的 data 域(結點中存儲數據元素的部分)都在根節點,任何關鍵字的查找都必須走一條從根節點到葉節點的路,所有關鍵字的查找路徑相同,導致每一個關鍵字的查詢效率基本相同,時間復雜度固定為 O(log n);而B樹搜索有可能會在非葉子節點結束,約靠近根節點的記錄查找時間越短,其性能等價於在關鍵字全集內做一次二分查找,查詢時間復雜度不固定,與 key 在樹中的位置有關,最好情況為O(1);
4、B+樹范圍查詢性能更優

因為B+樹的葉子節點使用了指針順序(鏈表)從小到大地連接在一起,B+樹葉節點兩兩相連可大大增加區間訪問性,只要遍歷葉子節點就可以實現整棵樹的遍歷,而B樹的葉子節點是相互獨立的,每個節點 key(索引)和 data 在一起,則無法查找區間;

【根據空間局部性原理:如果一個存儲器的某個位置被訪問,那么將它附近的位置也會被訪問】

若訪問節點 key為 50,則 key 為 55、60、62 的節點將來也可能被訪問,可利用磁盤預讀原理提前將這些數據讀入內存,減少了磁盤 IO 的次數。當然B+樹也能夠很好的完成范圍查詢,比如同時也會查詢 key 值在 50-70 之間的節點。

5、B+樹增刪文件(節點)時,效率更高

因為B+樹的葉子節點包含了所有關鍵字,並以有序的鏈表結構存儲

說明:InnoDB的一棵B+樹可以存放多少行數據?約2千萬。

B樹Balance ---“多路平衡查找樹”,任意節點的子樹的高度差都小於等於1

B樹有如下特點:

1、每個節點都存儲key和data,所有節點組成這棵樹,並且葉子節點指針為null;

2、任何一個關鍵字出現且只出現在一個結點中;

3、搜索有可能在非葉子結點結束(最好情況是O(1)就能找到數據);

4、在關鍵字全集內做一次查找,性能逼近二分查找。

B+樹【B樹的改進版, 讓內部節點(非葉子節點)只作索引使用,葉子節點包含了這棵樹的所有鍵值,葉子節點不存儲指針】

B+樹有如下特點:

1、只有葉子節點存儲data,包含了這棵樹的所有鍵值,葉子節點不存儲指針。(非葉子節點都只是存儲索引值,沒有實際的數據,並非真正的data);

2、增加了順序訪問指針,也就是每個葉子節點增加一個指向相鄰葉子節點的指針,這樣一棵樹成了數據庫系統實現索引的首選數據結構---B+樹。

區別

1)B+樹的data只存儲在葉子節點上,B樹的所有節點都存儲了key和data

B+樹的非葉節點不存儲data,這樣一個節點就可以存儲更多的索引值,可以使得樹更矮(高度更小),所以IO操作次數更少。

2)B+樹的所有葉結點構成一個有序鏈表,可以按照關鍵碼排序的次序來有序遍歷全部記錄

由於數據順序排列並且相連,所以便於區間查找和搜索。而B樹則需要進行每一層的遞歸遍歷,相鄰的元素可能在內存中不相鄰,所以緩存命中性沒有B+樹好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM