Mysql B+樹學習

Sam同學發表於2017-09-18

概述


要描述清楚B+樹,得先了解二叉查詢數,平衡二叉樹。


二叉查詢樹


這裡寫圖片描述
這裡寫圖片描述

任意節點,它的左子樹如果不為空,那麼左子樹上所有節點的值都小於根節點的值;
任意節點,他的右子樹如果不為空,那麼右子樹上的所有節點的值大於根節點的值。

這個特性給查詢帶來了方便,如上圖,要找key=3的鍵值,只要從6這個節點左子樹進行遞迴查詢即可,右子樹的節點可以完全不理會。


平衡二叉樹


二叉查詢樹有些缺陷,因為它對樹的左右子樹的高度沒有任何限制,極端的情況下會出現如下圖的類似連結串列的情況:

這裡寫圖片描述
這裡寫圖片描述

這種二叉查詢樹對查詢沒任何好處的。所以有必要將樹節點的左右子樹的高度做一下限制,儘量保持平衡。

二叉平衡樹 圖一

這裡寫圖片描述
這裡寫圖片描述

二叉查詢樹 圖二

這裡寫圖片描述
這裡寫圖片描述

二叉平衡樹要求節點的左右子樹的高度不要相差超過1,像圖二中的6這個節點,它的左子樹的高度是4,右子樹的高度是2,相差超過了1,不具備平衡二叉樹的特性。

由二叉平衡樹的特性可以看到,查詢的效率同樣很高,同時又避免了二叉查詢樹出現連結串列那種極端情況。


B+樹


圖三

這裡寫圖片描述
這裡寫圖片描述

B+樹有幾個特點:
1、是多叉而不是二叉了,使用多叉的目的是降低樹的高度;
2、每個節點不再只是儲存一個key了,可以儲存多個key;
3、非葉子節點儲存key,葉子節點儲存key和資料。
4、葉子節點兩兩相連,為順序查詢提供了幫助


Mysql為什麼選擇B+樹


1、B+樹的非葉子節點只是儲存key,佔用空間非常小,因此每一層的節點能索引到的資料範圍更加的廣。換句話說,每次IO操作可以觀看更多的資料;

2、葉子節點兩兩相連,符合磁碟的預讀特性。如圖三中儲存50和55的葉子節點,它有個指標指向了60和62這個葉子節點,那麼當我們從磁碟讀取50和55對應的資料的時候,由於磁碟的預讀特性,會順便把60和62對應的資料讀取出來。這個時候屬於順序讀取,而不是磁碟尋道了,加快了速度。

3、支援範圍查詢,而且部分範圍查詢非常高效,原因是資料都是儲存在葉子節點這一層,並且有指標指向其他葉子節點,這樣範圍查詢只需要遍歷葉子節點這一層,無需整棵樹遍歷。


Mysql 索引簡單描述


innodb儲存引擎

自增主鍵索引

自增主鍵索引就是使用了B+樹,索引檔案同時也是資料檔案,儲存了整張表的資料。也就是說,平時我們執行sql按照主鍵查詢的時候,那麼只需要從這個索引檔案獲取資料即可。這種索引也叫聚集索引 ,原因是所有資料是按照主鍵聚集的。

輔助索引(非自增主鍵索引,也可以叫非聚集索引)

這種索引檔案的葉子節點儲存了鍵值和書籤。鍵值說的就是列的值,書籤就是對應記錄的主鍵的值,如果按照某個輔助索引來查詢資料的時候,如果沒有用到覆蓋索引,那麼就得分兩步走:
1、先從輔助索引檔案中獲取到資料對應的主鍵;
2、根據主鍵從聚集索引中獲取真實資料。


MyISAM儲存引擎

MyISAM引擎使用B+Tree作為索引結構,葉節點的data域存放的是資料記錄的地址。這種稱為非聚集索引,這個命名其實是對應上面innodb的叫法而已。


原文連結


Mysql B+樹學習

相關文章