Mysql数据库优化

79 阅读2分钟

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

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

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

看下面对两条sql:第一条sql对内层u.travel_id做了聚合,第二条没有在内层做聚合,查询时间相差一倍。

1.第一条sql执行结果,时间50ms:

3820799234-5b9258b366fcb_fix732.webp

2.第二条sql执行结果,时间108ms

3064908484-5b92590279b79_fix732.webp

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

也就是说如果columnName建了索引, 这样查询索引可以生效columnName in ('value1','value2'...)也这样用可以, 这样查询索引不能生效 columnName in ( select values from ...)。

看下面的两条sql的执行计划,dest_id是主键:

1、这条sql索引生效

3762658558-5b925c2996792_fix732.webp

2、这条没有生效

2070912255-5b925c6f873ce_fix732.webp

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

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

1896959501-5b926170ee27b_fix732.webp

1、对abroad不建索引查询:

422388942-5b9261d963c02_fix732.webp

82929644-5b9261e38975a_fix732.webp

2、对abroad建索引查询,反而更慢:

2503125380-5b9261fea7100_fix732.webp

4169332436-5b926209add6c_fix732.webp

总结:

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