什么是B+Tree?
B+ Tree 是基于 B Tree 和葉子節點順序訪問指針進行實現,它具有 B Tree 的平衡性,并且通過順序訪問指針來提高區間查詢的性能。在 B+ Tree 中,一個節點中的 key 從左到右非遞減排列,如果某個指針的左右相鄰 key 分別是 keyi 和 keyi+1,且不為 null,則該指針指向節點的所有 key 大于等于 keyi 且小于等于 keyi+1。
為什么是B+Tree?
為了減少磁盤讀取次數,決定了樹的高度不能高,所以必須是先B-Tree;
以頁為單位讀取使得一次 I/O 就能完全載入一個節點,且相鄰的節點也能夠被預先載入;所以數據放在葉子節點,本質上是一個Page頁;
為了支持范圍查詢以及關聯關系, 頁中數據需要有序,且頁的尾部節點指向下個頁的頭部;
B+樹索引可分為聚簇索引和非聚簇索引?
主索引就是聚簇索引(也稱聚集索引,clustered index)輔助索引(有時也稱非聚簇索引或二級索引,secondary index,non-clustered index)。
如上圖,主鍵索引的葉子節點保存的是真正的數據。而輔助索引葉子節點的數據區保存的是主鍵索引關鍵字的值。
假如要查詢name = C 的數據,其搜索過程如下:a) 先在輔助索引中通過C查詢最后找到主鍵id = 9; b) 在主鍵索引中搜索id為9的數據,最終在主鍵索引的葉子節點中獲取到真正的數據。所以通過輔助索引進行檢索,需要檢索兩次索引。
之所以這樣設計,一個原因就是:如果和MyISAM一樣在主鍵索引和輔助索引的葉子節點中都存放數據行指針,一旦數據發生遷移,則需要去重新組織維護所有的索引。