本文只是個人閱讀筆記,原文建議詳細閱讀:什麼是b-樹
什麼是b+樹
我們知道mysql中索引最常用的資料結構就是1、雜湊表、二叉查詢樹、b樹的比較hash
和b+tree
,而其中的b+樹更是大多數 mysql 儲存引擎的預設索引型別。
要弄清楚b+樹,就得先知道b-樹(b-樹就是b樹),首先mysql索引之所以要使用樹
作為資料結構進行儲存是因為它查詢效率高,且可以保持有序
,解決hash
結構無序
只能用作等值查詢場景的缺陷。
我們知道二叉查詢樹的查詢插入的時間複雜度都是o(logn),之所以沒有使用二叉查詢樹是考慮到了磁碟io的問題:例如下面3階的b樹:索引是儲存在磁碟上的,當資料量很大的時候,整一棵二叉查詢樹的高度是很高的。而我們利用索引進行查詢時並不會將整個索引載入到記憶體,而是按頁讀取,將索引逐頁載入到記憶體,其中每個節點代表了乙個頁。假設乙個二叉查詢樹的樹高為n,意味著我們查詢乙個節點最差情況要進行讀取n次磁碟,而讀取一次磁碟耗費的時間通常需要幾ms,這是非常耗時的,所以我們希望樹高可以盡可能的小,其中的辦法就是使得乙個節點的子節點不止只有2,而是可以有更多的子節點,即是「n叉樹」,而b樹正是符合這個要求的。
其中b-樹的查詢、插入節點都是遵循這些特點進行操作的
b+樹是基於b-樹的一種變體,有著比b-樹更高的查詢效能。
乙個m階的b+樹具有如下幾個特徵:
有k個子樹的中間節點包含有k個元素(b樹中是k-1個元素),每個元素不儲存資料,只用來索引,所有資料都儲存在葉子節點。所有的葉子結點中包含了全部元素的資訊,及指向含這些元素記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序鏈結。所有的中間節點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素。
如下3階的b+樹:
因為b+樹的好處體現在查詢效能上,現在來看看它的單行查詢和範圍查詢:
衛星資料是值索引元素所指向的資料記錄,比如資料庫中的某一行。在b-樹中,所有節點都帶有衛星資料。而在b+樹中只有葉子節點帶有衛星資料,其他節點僅是索引,沒有關聯資料。所以單行查詢中,b+樹與b-樹有兩點不同:注:在資料庫的聚集索引中,葉子節點直接包含衛星資料。在非聚集索引中,葉子節點帶有指向衛星資料的指標。
b+樹中間節點沒有衛星資料,同樣大小的磁碟頁可以容納更多節點元素。意味著b+樹高會比b樹更小,查詢時io次數更少。
b+樹的查詢最終一定會查詢到葉子節點,而b-樹的查詢可能止於葉子節點也可能止於非葉子節點。所以b+樹會更加穩定。
單一節點儲存更多的元素,使得查詢的io次數更少。
所有查詢都要查詢到葉子節點,查詢效能穩定。
所有葉子節點形成有序鍊錶,便於範圍查詢。
索引之B樹 B 樹 B 樹 B 樹
原文索引之b樹 b 樹 b 樹 b 樹 b 樹即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left 和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中...
索引之B樹 B 樹 B 樹 B 樹詳解
索引之b樹 b 樹 b 樹 b 樹 b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則...
B樹與B 樹索引
b 樹 資料庫結構使用樹的結構索引,從演算法邏輯上看,二叉查詢樹的查詢速度和比較次數都是最小的。資料庫的索引儲存在磁碟上,當資料量比較大的時候,索引的大小可能有幾個g 甚至更多。當我們利用索引查詢的時候,不可能把整個索引載入到記憶體,能做的只有逐一載入每乙個磁碟頁,磁碟頁對應索引樹的節點。當利用二叉...