先作抽象定義以下:html
定義一條數據記錄爲一個二元組[key, data],key爲記錄的鍵值,對於不一樣的數據記錄,key是互不相同的;data爲數據記錄除key外的數據。node
d爲大於1的一個正整數,稱爲B-Tree的度(度能夠理解爲空間必定的條件下內節點的有效容量,與key大小和data大小有關)。mysql
h爲一個正整數,成爲B-Tree的高度。算法
每一個非葉子節點由n-1個key和n個指針組成,其中d<=n<=2d。sql
每一個葉子節點最少包含一個key和兩個指針,最多包含2d-1個key和2d個指針,葉節點的指針均爲null。性能
全部葉節點具備相同的深度,等於樹高h。atom
key和指針互相間隔,節點兩端是指針。spa
一個節點中的key從左到右遞增排序。指針
全部節點組成樹結構。xml
每一個指針要麼爲null,要麼指向領一個節點。
每一個節點申請同等大小的空間。
若是某個指針在節點node最左邊且不爲null,則其指向節點的全部key小於v(key1)v(key1),其中v(key1)v(key1)爲node的第一個key的值。
若是某個指針在節點node最右邊且不爲null,則其指向節點的全部key大於v(keym)v(keym),其中v(keym)v(keym)爲node的最後一個key的值。
若是某個指針在節點node的左右相鄰key分別是keyikeyi和keyi+1keyi+1且不爲null,則其指向節點的全部key小於v(keyi+1)v(keyi+1)且大於v(keyi)v(keyi)。
按key檢索數據的算法:從根節點進行二分查找,找到則返回對應節點的數據,不然對相應區間的指針指向的節點遞歸進行查找,直到找到節點或找到null指針。前者查找成功,後者查找失敗。
內節點不存儲data,只存儲key。
葉子節點不存儲指針。
葉子節點與內節點通常大小不一樣。
葉子節點增長一個指向相鄰葉子節點的指針,就造成了帶有順序訪問指針的B+Tree。經過這種方式,能夠提升區間訪問的性能。
基於B+tree的特色,內節點不存儲data,意味着出度能夠比B-tree更高,而出度越大,索引性能越好。
MyISAM葉子節點的data域存放的是數據記錄的地址,檢索索引時,若是指定的key存在,則取出data域的地址,而後用這個地址讀取記錄。這種索引方式叫作「非彙集」。
InnoDB主索引的葉子節點包含了完整的數據記錄,這種索引叫作彙集索引。InnoDB的表必須有主鍵,沒有顯示指定,系統會自動選擇一個列,若是不存在這種列,則自動生成一個隱含字段做爲主鍵。
InnoDB輔助索引data域存儲相應記錄主鍵的值而不是地址。
參考文章:http://blog.codinglabs.org/articles/theory-of-mysql-index.html