MySQL 效能優化——B+Tree 索引

GameTo發表於2019-03-16

索引是為了實現mysql高效能查詢的資料結構。

為了快速查詢資料,MySql在查詢演算法上進行了許多優化。但是就如二叉樹查詢演算法只能應用於二叉樹資料結構一樣,需要有滿足這種查詢演算法的資料結構,而資料本身的結構可能並不能滿足查詢演算法所需要的資料結構,所以MySql在資料之外維護了一個能應用於高效的查詢演算法的資料結構,這種資料結構,就是索引。
接下來將介紹使用最多的索引型別——B-Tree索引

B-Tree索引通常用的是B-Tree的變種B+Tree資料結構

B-Tree的節點是一個二元陣列[key,data],key是記錄的鍵,data是鍵對應的資料,每個節點的每個key左右各有一個指標,非葉子節點的指標分別指向下一層的節點,葉子節點的指標為null,如下圖:
3151600-7f2ab93d1be2e566.png
要查詢值的時候,會先從根節點開始查詢,根節點的每個key有左右兩個指標,可以通過這兩個指標訪問下一層節點。每次查詢都會將查詢值與key值進行比較,根據比較結果找到合適的指標進入下一層節點,最終,如此重複,最終找到對應的值或者值不存在

B+Tree節點是B-Tree的變種,相對於B-Tree而言B+Tree有如下不同:

在每個非葉子節點只會儲存key而不會儲存data,data將統一儲存到葉子節點中,葉子節點頁不需儲存指標,但是增加了指向相鄰葉子節點的指標

如下圖
2015-07-07_559b77f1e1377.png

1.全鍵值查詢,如whre key=val的查詢條件
2.鍵值範圍查詢,如where key>0此型別的範圍查詢
3.鍵字首查詢(只適合於最左字首查詢),如where key like 'abc%'有效,where key like '%abc'where key like '%abc%'等方式都無效

1.只能按照最左列開始查詢,否則無法使用
2.不能跳過索引中的列,例如有key(a,b,c),不能直接跳過a列使用b列索引,所以在建立索引的時候,順序也很重要
3.如果查詢中有一個列使用了範圍查詢,則右邊所有列都不能使用索引

相關文章