BTree索引
BTree是平衡搜索多叉樹,設樹的度爲d(d>1),高度爲h,那麼BTree要滿足以一下條件:
- 每個葉子結點的高度一樣,等於h;
- 每個非葉子結點由n-1個key和n個指針point組成,其中d<=n<=2d,key和point相互間隔,結點兩端一定是key;
- 葉子結點指針都爲null;
- 非葉子結點的key都是[key,data]二元組,其中key表示作爲索引的鍵,data爲鍵值所在行的數據;
BTree的結構如下:
在BTree的機構下,就可以使用二分查找的查找方式,查找複雜度爲h*log(n),一般來說樹的高度是很小的,一般爲3左右,因此BTree是一個非常高效的查找結構。
B+Tree索引
B+Tree是BTree的一個變種,設d爲樹的度數,h爲樹的高度,B+Tree和BTree的不同主要在於:
- B+Tree中的非葉子結點不存儲數據,只存儲鍵值;
- B+Tree的葉子結點沒有指針,所有鍵值都會出現在葉子結點上,且key存儲的鍵值對應的數據的物理地址;
B+Tree的結構如下:
一般來說B+Tree比BTree更適合實現外存的索引結構,因爲存儲引擎的設計專家巧妙的利用了外存(磁盤)的存儲結構,即磁盤的一個扇區是整數倍的page(頁),頁是存儲中的一個單位,通常默認爲4K,因此索引結構的節點被設計爲一個頁的大小,然後利用外存的“預讀取”原則,每次讀取的時候,把整個節點的數據讀取到內存中,然後在內存中查找,已知內存的讀取速度是外存讀取I/O速度的幾百倍,那麼提升查找速度的關鍵就在於儘可能少的磁盤I/O,那麼可以知道,每個節點中的key個數越多,那麼樹的高度越小,需要I/O的次數越少,因此一般來說B+Tree比BTree更快,因爲B+Tree的非葉節點中不存儲data,就可以存儲更多的key。
帶順序索引的B+TREE
很多存儲引擎在B+Tree的基礎上進行了優化,添加了指向相鄰葉節點的指針,形成了帶有順序訪問指針的B+Tree,這樣做是爲了提高區間查找的效率,只要找到第一個值那麼就可以順序的查找後面的值。
B+Tree的結構如下: