索引是一種數據存儲結構,對表中一列或多列進行排序以快速定位獲取數據。就像一本書的目錄就是一個索引,如果想在一本書中找到某個主題,一般會先找到對應頁碼。在mysql中,存儲引擎用類似的方法使用索引,先在索引中找到對應值,然后根據匹配的索引記錄找到對應的行。
B樹
大多數存儲引擎都支持B樹索引。B樹通常意味着所有的值都是按順序存儲的,並且每一個葉子到根的距離相同。B樹索引能夠加快訪問數據的速度,因為存儲引擎不再需要進行全表掃描來獲取數據。下圖就是一顆簡單的B數。
B樹的查詢流程:
如上圖我要從找到E字母,查找流程如下:
1)獲取根節點的關鍵字進行比較,當前根節點關鍵字為M,E<M(26個字母順序),所以往找到指向左邊的子節點(二分法規則,左小右大,左邊放小於當前節點值的子節點、右邊放大於當前節點值的子節點)。
2)拿到關鍵字D和G,D<E<G 所以直接找到D和G中間的節點。
3)拿到E和F,因為E=E 所以直接返回關鍵字和指針信息(如果樹結構里面沒有包含所要查找的節點則返回null)。
4)通過指針信息取出這條記錄的所有信息。
B+樹
下圖為B+樹的結構,B+樹是B樹的升級版,我們可以觀察一下,B樹和B+樹的區別是什么?
B+樹和B樹的區別是:
1)B樹的節點(根節點/父節點/中間節點/葉子節點)中沒有重復元素,B+樹有。
2)B樹的中間節點會存儲數據指針信息,而B+樹只有葉子節點才存儲。
3)B+樹的每個葉子節點有一個指針指向下一個節點,把所有的葉子節點串在了一起。
從下圖我們可以直觀的看到B樹和B+樹的區別:紫紅色的箭頭是指向被索引的數據的指針,大紅色的箭頭即指向下一個葉子節點的指針。
假設被索引的列是主鍵,現在查找主鍵為5的記錄,模擬一下查找的過程:
B樹,在倒數第二層的節點中找到5后,可以立刻拿到指針獲取行數據,查找停止。
B+樹,在倒數第二層的節點中找到5后,由於中間節點不存有指針信息,則繼續往下查找,在葉子節點中找到5,拿到指針獲取行數據,查找停止。
B+樹每個父節點的元素都會出現在子節點中,是子節點的最大(或最小)元素。葉子節點存儲了被索引列的所有的數據。
那B+樹比起B樹的優點:
1)由於中間節點不存指針,同樣大小的磁盤頁可以容納更多的節點元素,樹的高度就小。(數據量相同的情況下,B+樹比B樹更加“矮胖”),查找起來就更快。
2)B+樹每次查找都必須到葉子節點才能獲取數據,而B樹不一定,B樹可以在非葉子節點上獲取數據。因此B+樹查找的時間更穩定。
3)B+樹的每一個葉子節點都有指向下一個葉子節點的指針,方便范圍查詢和全表查詢:只需要從第一個葉子節點開始順着指針一直掃描下去即可,而B樹則要對樹做中序遍歷。
參考:https://blog.csdn.net/qq_36261130/article/details/100556264