例如组合索引(a1,a2,a3),组合索引的生效原则是
从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用;
比如
select * from Table where a1=3 and a2=4 and a3=5 这种三个索引依次顺序使用中间没有断点,全部发挥作用;
select * from Table where a1=3 and a3=5 这种情况下a2就是断点,a1发挥了效果,a3没有效果
select * from Table where a2=3 and a3=4 这种情况下a1就是断点,在a1后面的索引都没有发挥作用,这种写法联合索引没有任何效果;
select * from Table where a2=4 and a1=3 and a3=5 这样索引全部发挥作用,只要a1,a2,a3都用到就可以,和使用得顺序无关。
组合索引使用判断:
1: select * from Table where a1=3 and a2=5 and a3=4;
a1a2a3三个索引都在where条件里面用到了,而且都发挥了作用
2: select * from Table where a3=4 and a2=6 and a1=3;
where里面的条件顺序在查询之前会被mysql自动优化,效果跟上一句一样
3: select * from Table where a1=3 and a3=7;
a1用到索引,a2没有用,所以a3是没有用到索引效果的
4: select * from Table where a1=3 and a2>7 and a3=3;(范围值就算是断点)
a1用到了,a2也用到了,a3没有用到,这个地方a2是范围值,也算断点,只不过自身用到了索引
5: select * from Table where a2=3 and a3=4;
因为a1索引没有使用,所以这里 a2a3都没有用上索引效果
6: select * from Table where a1>4 and a2=7 and a3=9;
a1用到了 a2没有使用,a3没有使用
7: select * from Table where a1=3 order by a2;
a1用到了索引,a2在结果排序中也用到了索引的效果,前面说了,a1下面任意一段的a2是排好序的
8: select * from Table where a1=3 order by a3;
a1用到了索引,但是这个地方a3没有发挥排序效果,因为中间断点了,使用 expla1in 可以看到 filesort
9: select * from Table where a2=3 order a2y a1;
a2没有用到索引,排序中a1也没有发挥索引效果