SELECT DATE_FORMAT(t1.createTime, '%Y%m%d%H') AS monTime, IFNULL(t1.monValue, 0) AS monValue FROM device_monitor_attr_his t1 INNER JOIN ( SELECT MAX(id) id FROM device_monitor_attr_his t WHERE deviceID =3763 AND monKey =97 AND createTime > '2023-05-19' AND createTime < '2023-05-26 23:59:59' GROUP BY DATE_FORMAT(createTime, '%Y%m%d') ) t2 ON t2.id = t1.id
时间: 2024-02-12 11:07:01 浏览: 123
MySQL IF、 Bewteen、 AS、 Date_Format、Left join on等关键字实例
这个 SQL 查询语句是用来查询设备 3763 在 2023 年 5 月 19 日至 2023 年 5 月 26 日之间的监控数据,并按照每小时的时间段进行聚合,并且只显示最新的监控数据。
对于这个 SQL 查询语句,我之前提到过的三点优化建议具体实现方法如下:
1. 索引优化:在 `device_monitor_attr_his` 表上建立联合索引,以提高查询效率。具体的 SQL 命令如下:
```
ALTER TABLE `device_monitor_attr_his` ADD INDEX `idx_deviceID_monKey_createTime` (`deviceID`, `monKey`, `createTime`);
```
2. 子查询优化:将子查询改写为联合查询,以提高查询效率。具体的 SQL 命令如下:
```
SELECT DATE_FORMAT(t1.createTime, '%Y%m%d%H') AS monTime, IFNULL(t1.monValue, 0) AS monValue
FROM device_monitor_attr_his t1
INNER JOIN (
SELECT DATE_FORMAT(createTime, '%Y%m%d') AS monDate, MAX(id) AS id
FROM device_monitor_attr_his
WHERE deviceID = 3763 AND monKey = 97 AND createTime > '2023-05-19' AND createTime < '2023-05-26 23:59:59'
GROUP BY monDate
) t2 ON t1.id = t2.id;
```
3. 时间范围限制优化:在 `device_monitor_attr_his` 表上建立按照 `createTime` 字段的索引,以提高查询效率。具体的 SQL 命令如下:
```
ALTER TABLE `device_monitor_attr_his` ADD INDEX `idx_createTime` (`createTime`);
```
希望这些优化建议能对你有所帮助。
阅读全文