索引在計算機中的位置
一般來說,索引本身也很大,不可能全部存儲在內存中,一般以文件形式存儲在磁盤上,索引檢索需要磁盤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+樹好。
