組合索引的有序性和最左前綴原理
【強制】理解組合索引最左前綴原則,避免重復建設索引硬鞍,如果建立了(a,b,c),相當于建立了(a), (a,b), (a,b,c)
假設有索引(A,B)
mysql創(chuàng)建組合索引的規(guī)則是首先會對復合索引的最左邊的戴已,也就是第一個A字段的數(shù)據(jù)進行排序固该,在第一個字段的排序基礎上,然后再對后面第二個的B字段進行排序糖儡。其實就相當于實現(xiàn)了類似 order by A B這樣一種排序規(guī)則伐坏。
第一個A字段是絕對有序的,而第二字段就是無序的了握联。所以通常情況下桦沉,直接使用第二個B字段進行條件判斷是用不到索引的
那么什么時候才能用到呢?
當然是B字段的索引數(shù)據(jù)也是有序的情況下才能使用。
什么時候才是有序的呢金闽?
只有在A字段是等值匹配的情況下纯露,B才是有序的。
組合索引查詢的各種場景
有 Index (A,B,C) ——組合索引多字段是有序的代芜,并且是個完整的BTree 索引埠褪。
下面條件可以用上該組合索引查詢:
A>5
A=5 AND B>6
A=5 AND B=6 AND C=7
A=5 AND B IN (2,3) AND C>5
下面條件將不能用上組合索引查詢:
B>5 ——查詢條件不包含組合索引首列字段
B=6 AND C=7 ——查詢條件不包含組合索引首列字段
下面條件將能用上部分組合索引查詢:
A>5 AND B=2 ——當范圍查詢使用第一列,查詢條件僅僅能使用第一列
A=5 AND B>6 AND C=2 ——范圍查詢使用第二列挤庇,查詢條件僅僅能使用前二列
組合索引排序的各種場景
有組合索引 Index(A,B)钞速。
下面條件可以用上組合索引排序:
ORDER BY A——首列排序
A=5 ORDER BY B——第一列過濾后第二列排序
ORDER BY A DESC, B DESC——注意,此時兩列以相同順序排序
A>5 ORDER BY A——數(shù)據(jù)檢索和排序都在第一列
下面條件不能用上組合索引排序:
ORDER BY B ——排序在索引的第二列
A>5 ORDER BY B ——范圍查詢在第一列嫡秕,排序在第二列
A IN(1,2) ORDER BY B ——理由同上
ORDER BY A ASC, B DESC ——注意渴语,此時兩列以不同順序排序
建議
如果對有沒有用上索引有疑惑可以寫完sql以后 用explain 來運行一下sql
可以更有利于理解sql的執(zhí)行過程