b-樹(m階):
1.根節點至少有2個子節點;
2.中間節點包含k個子節點和k-1個元素,m/2 <= k <= m;
3.每個節點中的元素從小到大排列,節點當中k-1個元素正好是k個孩子包含的元素的值域分劃;
4.每一個葉子節點都包含k-1個元素,其中 m/2 <= k <= m;
5.所有葉子節點都在同一層。
b+樹(m階):
在b-樹的基礎上添加了新的特性:
1.有k個子樹的中間節點包含有k個元素(B樹中是k-1個元素),每個元素不儲存資料,只儲存索引,所有資料都儲存在葉子節點。
2.所有的葉子結點中包含了全部元素的資訊,及指向含這些元素記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序連結。
3.所有的中間節點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素。
b+樹相比b-樹優點:
1.io次數少:b+樹中間節點只存索引,不存在實際的資料,所以可以儲存更多的資料。索引樹更加的矮胖,io次數更少。
2.效能穩定:b+樹資料只存在於葉子節點,查詢效能穩定
3.範圍查詢簡單:b+樹不需要中序遍歷,遍歷連結串列即可
mysql索引:
索引欄位要儘量小:通過上面的分析,我們知道IO次數取決於b+數的高度h,假設當前資料表的資料為N,每個磁碟塊的資料項的數量是m,則有h=㏒(m+1)N,當資料量N一定的情況下,m越大,h越小;而m = 磁碟塊的大小 / 資料項的大小,磁碟塊的大小也就是一個數據頁的大小,是固定的,如果資料項佔的空間越小,資料項的數量越多,樹的高度越低。這就是為什麼每個資料項,即索引欄位要儘量的小,比如int佔4位元組,要比bigint8位元組少一半。這也是為什麼b+樹要求把真實的資料放到葉子節點而不是內層節點,一旦放到內層節點,磁碟塊的資料項會大幅度下降,導致樹增高。當資料項等於1時將會退化成線性表。
最左匹配特性:當b+樹的資料項是複合的資料結構,比如(name,age,sex)的時候,b+數是按照從左到右的順序來建立搜尋樹的,比如當(張三,20,F)這樣的資料來檢索的時候,b+樹會優先比較name來確定下一步的所搜方向,如果name相同再依次比較age和sex,最後得到檢索的資料;但當(20,F)這樣的沒有name的資料來的時候,b+樹就不知道下一步該查哪個節點,因為建立搜尋樹的時候name就是第一個比較因子,必須要先根據name來搜尋才能知道下一步去哪裡查詢。比如當(張三,F)這樣的資料來檢索時,b+樹可以用name來指定搜尋方向,但下一個欄位age的缺失,所以只能把名字等於張三的資料都找到,然後再匹配性別是F的資料了, 這個是非常重要的性質,即索引的最左匹配特性。
過度使用索引的缺點:
1.在建立索引和維護索引 會耗費時間,隨著資料量的增加而增加
2.索引檔案會佔用物理空間,除了資料表需要佔用物理空間之外,每一個索引還會佔用一定的物理空間
3.當對錶的資料進行 INSERT,UPDATE,DELETE 的時候,索引也要動態的維護,這樣就會降低資料的維護速度,(建立索引會佔用磁碟空間的索引檔案。一般情況這個問題不太嚴重,但如果你在一個大表上建立了多種組合索引,索引檔案的會膨脹很快)