概述
要描述清楚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的叫法而已。
原文連結