在數據以外,數據庫系統還維護着知足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就能夠在這些數據結構上實現高級查找算法。這種數據結構,就是索引。html
B-Tree是一種平衡的多路查找(又稱排序)樹,在文件系統中和數據庫系統中有所應用。主要用做文件的索引。其中的B就表示平衡(Balance) 。node
爲了描述B-Tree,首先定義一條數據記錄爲一個二元組[key, data],key爲記錄的鍵值,對於不一樣數據記錄,key是互不相同的;data爲數據記錄除key外的數據。那麼B-Tree是知足下列條件的數據結構:mysql
d爲大於1的一個正整數,稱爲B-Tree的度算法
h爲一個正整數,稱爲B-Tree的高度sql
key和指針互相間隔,節點兩端是指針數據庫
一個節點中的key從左到右非遞減排列微信
全部節點組成樹結構數據結構
每一個指針要麼爲null,要麼指向另一個節點post
每一個非葉子節點由n-1個key和n個指針組成,其中d<=n<=2d性能
每一個葉子節點最少包含一個key和兩個指針,最多包含2d-1個key和2d個指針,葉節點的指針均爲null
全部葉節點具備相同的深度,等於樹高h
若是某個指針在節點node最左邊且不爲null,則其指向節點的全部key小於key1,其中key1爲node的第一個key的值
若是某個指針在節點node最右邊且不爲null,則其指向節點的全部key大於keym,其中keym爲node的最後一個key的值
若是某個指針在節點node的左右相鄰key分別是keyi和keyi+1且不爲null,則其指向節點的全部key小於keyi+1且大於keyi
B-Tree是一個很是有效率的索引數據結構。這主要得益於B-Tree的度能夠很是大,高度會變的很是小,只須要二分幾回就能夠找到數據。例如一個度爲d的B-Tree,設其索引N個key,則其樹高h的上限爲logd((N+1)/2)),檢索一個key,其查找節點個數的漸進複雜度爲O(logdN)。
在B-Tree中按key檢索數據的算法很是直觀:
首先從根節點進行二分查找,若是找到則返回對應節點的data
不然對相應區間的指針指向的節點遞歸進行查找,若是找到則返回對應節點的data
若是找不到,則重複過程2,直到找到節點或找到null指針,前者查找成功,後者查找失敗。
B+Tree是B-Tree的一種變種。通常來講,B+Tree比B-Tree更適合實現外存儲索引結構,具體緣由與外存儲器原理及計算機存取原理有關,將在下篇文章中討論。
區別於B-Tree:
每一個節點的指針上限爲2d而不是2d+1
內節點不存儲data,只存儲key;葉子節點不存儲指針
通常在數據庫系統或者文件系統中,並非直接使用B+Tree做爲索引數據結構的,而是在B+Tree的基礎上作了優化,增長了順序訪問指針。提高了區間查詢的性能。
如上圖所示,在B+Tree的每一個葉子節點增長一個指向相鄰葉子節點的指針,就造成了帶有順序訪問指針的B+Tree。例如要查詢18到30之間的數據記錄,只要先找到18,而後順着順序訪問指針就能夠訪問到全部的數據節點。這樣就提高了區間查詢的性能。數據庫的索引全掃描 index和索引範圍掃描 range 就是基於此實現的。
推薦閱讀
MySQL——經過EXPLAIN分析SQL的執行計劃
MySQL——索引基礎
MySQL——索引優化實戰