Mysql的B+樹索引在單列索引上比較好理解,結構如下:
那組合索引的B+樹存儲結構是什么樣的呢,為什么會有最左前綴原理,看了很多帖子找到了答案
-
數據表
-
B+樹結構
b c d設置組合索引
對於聯合索引來說只不過比單值索引多了幾列,而這些索引列全都出現在索引樹上。對於聯合索引,存儲引擎會首先根據第一個索引列排序,如上圖我們可以單看第一個索引列,如,1 1 5 12 13…它是單調遞增的;如果第一列相等則再根據第二列排序,依次類推就構成了上圖的索引樹,上圖中的1 1 4 ,1 1 5以及13 12 4, 13 16 1, 13 16 5就可以說明這種情況。
- 聯合索引的查找方式
當我們的SQL語言可以應用到索引的時候,比如 select * from T1 where b = 12 and c = 14 and d = 3; 也就是T1表中a列為4的這條記錄。存儲引擎首先從根節點(一般常駐內存)開始查找,第一個索引的第一個索引列為1,12大於1,第二個索引的第一個索引列為56,12小於56,於是從這倆索引的中間讀到下一個節點的磁盤文件地址,從磁盤上Load這個節點,通常伴隨一次磁盤IO,然后在內存里去查找。當Load葉子節點的第二個節點時又是一次磁盤IO,比較第一個元素,b=12,c=14,d=3完全符合,於是找到該索引下的data元素即ID值,再從主鍵索引樹上找到最終數據。
- 最左前綴匹配原則
之所以會有最左前綴匹配原則和聯合索引的索引構建方式及存儲結構是有關系的。
首先我們創建的idx_t1_bcd(b,c,d)索引,相當於創建了(b)、(b、c)(b、c、d)三個索引,看完下面你就知道為什么相當於創建了三個索引。
我們看,聯合索引是首先使用多列索引的第一列構建的索引樹,用上面idx_t1_bcd(b,c,d)的例子就是優先使用b列構建,當b列值相等時再以c列排序,若c列的值也相等則以d列排序。我們可以取出索引樹的葉子節點看一下。
索引的第一列也就是b列可以說是從左到右單調遞增的,但我們看c列和d列並沒有這個特性,它們只能在b列值相等的情況下這個小范圍內遞增,如第一葉子節點的第1、2個元素和第二個葉子節點的后三個元素。
由於聯合索引是上述那樣的索引構建方式及存儲結構,所以聯合索引只能從多列索引的第一列開始查找。所以如果你的查找條件不包含b列如(c,d)、(c)、(d)是無法應用緩存的,以及跨列也是無法完全用到索引如(b,d),只會用到b列索引。
作者:夾胡碰
鏈接:https://www.jianshu.com/p/a6862892937b
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
