You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何加速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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:58:26