b-樹和b+樹以及mysql索引

b-樹(m階):mysql

1.根節點至少有2個子節點;sql

2.中間節點包含k個子節點和k-1個元素,m/2 <= k <= m;數據結構

3.每一個節點中的元素從小到大排列,節點當中k-1個元素正好是k個孩子包含的元素的值域分劃;性能

4.每個葉子節點都包含k-1個元素,其中 m/2 <= k <= m;mysql索引

5.全部葉子節點都在同一層。指針

b+樹(m階):索引

在b-樹的基礎上添加了新的特性:io

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 的時候,索引也要動態的維護,這樣就會下降數據的維護速度,(創建索引會佔用磁盤空間的索引文件。通常狀況這個問題不太嚴重,但若是你在一個大表上建立了多種組合索引,索引文件的會膨脹很快)

相關文章
相關標籤/搜索