在写项目过程中,我在类似数据汇总的模块中发现一个SQL执行缓慢,它包含了一些分组+去重+求和的操作,我使用派生表对这个SQL进行了一些改进,查询速度在20W记录下是提高了30多倍。由于我MySQL学习还不够深入,我觉得应该还有很多更好的优化方式,比如如何有效利用索引之类的。。。,所以在此向大家请教一下
### 以下是原来的SQL和现在的SQL,以及它们的EXPLAIN结果
这个功能主要是按字段area分组,对device数量进行统计(需要去重),同时对num求和
#### 原来的
SQL语句
EXPLAIN select COUNT(distinct device_id) deviceCount , SUM(num) beetleCount, area `name`, adcode `code` from device_maintenance where adcode like concat('35', '%') group by area;
- EXPLAIN结果
#### 现在的(改进后的)
SQL语句
EXPLAIN select COUNT(*) deviceCount , SUM(num) beetleCount, area `name`, adcode `code` from ( select device_id ,sum(num) num, area , adcode from device_maintenance where adcode like '35%' GROUP BY device_id ) t group by area ORDER BY NULL
- EXPLAIN结果