4

最近项目开发遇到sql比较复杂,多表连接嵌套查询,做了很多优化。分享一下我调优的经验:

1、嵌套查询尽量减少内层查询的结果数

嵌套查询能在内层做统计或者聚合多尽量就在内层做聚合,如果内层聚合以后外层仍要聚合,内层多聚合也要做。不要为了方便只在外层做聚合,内层结果数对查询效率影响很大。

看下面对两条sql:第一条sql对内层u.travel_id做了聚合,第二条没有在内层做聚合,查询时间相差一倍:
1.第一条sql执行结果,时间50ms:
图片描述

2.第二条sql执行结果,时间108ms
图片描述

2、MySQL查询In对索引支持不好,只支持常量不支持变量

*也就是说如果columnName建了索引,
这样查询索引可以生效columnName in ('value1','value2'...)也这样用可以,
这样查询索引不能生效 columnName in ( select values from ...)。*
看下面的两条sql的执行计划,dest_id是主键:
1、这条sql索引生效
图片描述
2、这条没有生效
图片描述

3、对于值很少的字段不要建索引

对于值很少的字段建索引作用不大*,由于通过索引字段筛选之后仍可能有很多记录需要筛选,看下图表dest的abroad字段只有两个值:
图片描述
1、对abroad不建索引查询:
图片描述
图片描述

2、对abroad建索引查询,反而更慢:
图片描述
图片描述

总结:

对于sql调优需要对各种方案都执行看具体执行时间,才能判断优劣,还要考虑到有些表数据是一直增长到,已经调好到sql能不能适应数据增长很重要,有些sql调优方案在数据量不大到情况下可能不如另外一种方案,但是数据量增长以后可能就不一样了。


杜若
67 声望3 粉丝