如何加速MySQL查询执行?新手慢查询优化求助
数据库查询优化:1800行结果耗时5-10分钟的解决方案
一、移除冗余关联操作
你的查询中,plant_data pd和inv_status iss两个表未在SELECT子句中输出任何字段,完全可以从查询中移除,减少不必要的表关联开销:
SELECT pn.plant_name, dl.devName, dds.run_state, dds.inverter_state, dds.time_save FROM Device_Data_String dds INNER JOIN device_list dl ON dds.devIds = dl.deviceid INNER JOIN plant_name pn ON dl.stationcode = pn.stationcode WHERE dds.date_save = "2023-07-19" GROUP BY pn.plant_name, dl.devName, dds.run_state, dds.inverter_state, dds.time_save;
二、添加复合索引解决全表扫描
从EXPLAIN结果可见,Device_Data_String(dds)表执行了全表扫描(type: ALL),这是查询缓慢的核心原因。为该表创建覆盖过滤条件和关联字段的复合索引:
CREATE INDEX idx_dds_date_devids ON Device_Data_String(date_save, devIds);
该索引可让数据库快速定位date_save='2023-07-19'的行,同时直接通过索引获取devIds用于关联device_list表,彻底避免全表扫描。
三、优化GROUP BY操作
EXPLAIN中显示的Using temporary说明GROUP BY触发了临时表创建,会大幅增加性能开销:
- 若
pn.plant_name, dl.devName, dds.run_state, dds.inverter_state, dds.time_save字段组合本身无重复数据,直接删除GROUP BY子句即可; - 若确实需要去重,用
DISTINCT替代GROUP BY,执行计划通常更高效:
SELECT DISTINCT pn.plant_name, dl.devName, dds.run_state, dds.inverter_state, dds.time_save FROM Device_Data_String dds INNER JOIN device_list dl ON dds.devIds = dl.deviceid INNER JOIN plant_name pn ON dl.stationcode = pn.stationcode WHERE dds.date_save = "2023-07-19";
四、验证优化效果
执行优化后,重新运行EXPLAIN检查:
- 确认
dds表的type变为ref或range,不再是ALL; - 确认
Extra字段不再出现Using temporary(移除GROUP BY或替换为DISTINCT后)。
内容的提问来源于stack exchange,提问作者exxyzza
相关产品推荐
相关产品推荐

