簡介
1、必讀https://www.playscala.cn/article/view?_id=10-5d318144eeab561d2405e2de
https://www.cnblogs.com/vincently/p/4526560.html
b樹
1、每個節點最多擁有m個子樹
2、根節點至少有2個子樹
3、分支節點至少擁有m/2顆子樹(除根節點和葉子節點外都是分支節點)
4、所有葉子節點都在同一層
5、每個節點最多可以有m-1個key,並且以升序排列
B+樹
1、有k個子樹的中間節點包含有k個元素(B樹中是k-1個元素),每個元素不保存數據,只用來索引,所有數據都保存在葉子節點;
2、葉子節點中包含了全部元素的信息,按照關鍵字的大小從左到右排序;
3、中間節點的元素同時存在於子節點中,在子節點元素中是最大。
B+樹爲什麼更適合做索引
1、B+的非葉子節點只包含索引不包含數據,所以每個數據塊可以存儲更多的數據,B+樹比B樹更矮胖(磁盤io次數少)
2、查詢穩定(每次都會查到葉子節點)
3、範圍查詢簡便(葉子節點鏈表遍歷),B樹需要進行中序遍歷比較複雜
磁盤和B+樹有什麼關係
1、索引已B+樹的數據結構存儲在磁盤中,磁盤每次以磁盤塊爲單位進行讀取
2、InnoDB存儲引擎中有頁(Page)的概念,頁是其磁盤管理的最小單位,因此InnoDB每次申請磁盤空間時都會是若干地址連續磁盤塊來達到頁的大小(默認16KB)
3、預讀,每一次IO時,不僅僅把當前磁盤地址的數據加載到內存,同時也把相鄰數據也加載到內存緩衝區中。(因爲局部預讀原理說明:當訪問一個地址數據的時候,與其相鄰的數據很快也會被訪問到。)每次磁盤IO讀取的數據我們稱之爲一頁(page),這也就意味着讀取一頁內數據的時候,實際上發生了一次磁盤IO。
4、B+Tree的高度一般都在2~4層。mysql的InnoDB存儲引擎在設計時是將根節點常駐內存的,也就是說查找某一鍵值的行記錄時最多只需要1~3次磁盤I/O操作
參考
2-3樹
https://www.cnblogs.com/atai/p/9606757.html
https://mp.weixin.qq.com/s/rDCEFzoKHIjyHfI_bsz5Rw
B樹
自平衡、矮胖節點內元素多些沒有關係,因爲是內存操作
b+樹
https://www.jianshu.com/p/1f2560f0e87fb+樹