Mysql优化思维导图:
问题描述:
假设某表一个联合索引(c1,c2,c3,c4),以下哪条语句中只使用到该联合索引的c1,c2,c3部分?
A where c1=x and c2=x and c4>x and c3=x B where c1=x and c2=x and c4=x order by c3=x C where c1=x and c4=x group by c3,c2 D where c1=? and c5=? order by c2, c3 E where c1=? and c2=? and c5=? order by c2,c3
准备工作:建立库,建立表,建立索引
Btree左前缀使用规则:
如按f1, f2,f3, ....fN建立索引
查询时,where条件中,按f1,f2...的顺序由左到右,索引发挥作用,
如果中间某列没有条件或者like条件,导致后面的列,索引用不上。
索引也能用来排序,针对有顺序的表,索引的使用可以避免临时表和文件排序。
select_type: SIMPLE 简单查询
type: range(表示范围查找效果) ref(表示)
A 选项分析 :
图1
B 选项分析
图2
C 选项分析:
在图1,我们可以按照索引的顺序,直接进行分组,但选项中排序为order by c3,c2,
经试验,
图3
可以看到查询过程中,创建了临时表(Using temporary),文件排序(Using filesort)
变化order by顺序,
由于c1下的c2, c2下的c3, c3下的c4都是有顺序的,所以避免了临时表的创建,文件的排序,
D选项也是一样的道理,该选项中只用到了c1,c2,c3;
E 选项分析,
由于在该表达式条件中,where c1=? and c2=? and c5=? order by c2,c3,已经确定了c2,c2下的c3是有顺序的,所以....