示例表:

mysql多表查询使用排序索引失效 mysql多个排序条件_mysql多表查询使用排序索引失效


Mysql如何选择合适的索引

mysql> EXPLAIN select * from employees where name > ‘a’;

mysql多表查询使用排序索引失效 mysql多个排序条件_sql_02


如果用name索引需要遍历name字段联合索引树,然后还需要根据遍历出来的主键值去主键索引树里再去查出最终数据,成本比全表扫描还高,可以用覆盖索引优化,这样只需要遍历name字段的联合索引树就能拿到所有结果,如下:

mysql> EXPLAIN select name,age,position from employees where name > ‘a’ ;

mysql多表查询使用排序索引失效 mysql多个排序条件_mysql_03


mysql> EXPLAIN select * from employees where name > ‘zzz’ ;

mysql多表查询使用排序索引失效 mysql多个排序条件_字段_04


对于上面这两种 name>‘a’ 和 name>‘zzz’ 的执行结果,mysql最终是否选择走索引或者一张表涉及多个索引,mysql最终如何选择索引,我们可以用trace工具来一查究竟,开启trace工具会影响mysql性能,所以只能临时分析sql使用,用完之后立即关闭

常见sql深入优化

Order by与Group by优化

mysql多表查询使用排序索引失效 mysql多个排序条件_mysql多表查询使用排序索引失效_05


分析:利用最左前缀法则:中间字段不能断,因此查询用到了name索引,从key_len=74也能看出,age索引列用在排序过程中,因为Extra字段里没有using filesort

mysql多表查询使用排序索引失效 mysql多个排序条件_字段_06


分析:从explain的执行结果来看:key_len=74,查询使用了name索引,由于用了position进行排序,跳过了age,出现了Using filesort

mysql多表查询使用排序索引失效 mysql多个排序条件_mysql多表查询使用排序索引失效_07


分析:查找只用到索引name,age和position用于排序,无Using filesort

mysql多表查询使用排序索引失效 mysql多个排序条件_字段_08


分析:和Case 3中explain的执行结果一样,但是出现了Using filesort,因为索引的创建顺序为name,age,position,但是排序的时候age和position颠倒位置了

mysql多表查询使用排序索引失效 mysql多个排序条件_字段_09


分析:与Case 4对比,在Extra中并未出现Using filesort,因为age为常量,在排序中被优化,所以索引未颠倒,不会出现Using filesort

mysql多表查询使用排序索引失效 mysql多个排序条件_mysql_10


分析:虽然排序的字段列与索引顺序一样,且order by默认升序,这里position desc变成了降序,导致与索引的排序方式不同,从而产生Using filesort。Mysql8以上版本有降序索引可以支持该种查询方式

mysql多表查询使用排序索引失效 mysql多个排序条件_字段_11


分析:对于排序来说,多个相等条件也是范围查询

mysql多表查询使用排序索引失效 mysql多个排序条件_mysql多表查询使用排序索引失效_12


可以用覆盖索引优化

mysql多表查询使用排序索引失效 mysql多个排序条件_字段_13


优化总结:

1、MySQL支持两种方式的排序filesort和index,Using index是指MySQL扫描索引本身完成排序。index效率高,filesort效率低。

2、order by满足两种情况会使用Using index。

  1. order by语句使用索引最左前列。
  2. 使用where子句与order by子句条件列组合满足索引最左前列。
    3、尽量在索引列上完成排序,遵循索引建立(索引创建的顺序)时的最左前缀法则。
    4、如果order by的条件不在索引列上,就会产生Using filesort。
    5、能用覆盖索引尽量用覆盖索引
    6、group by与order by很类似,其实质是先排序后分组,遵照索引创建顺序的最左前缀法则。对于groupby的优化如果不需要排序的可以加上order by null禁止排序。注意,where高于having,能写在where中的限定条件就不要去having限定了。