B樹和B+樹

簡介

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+樹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章