数据库 索引

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是有顺序的,所以....

相关文章