如何优化查询而不使用子查询
使用子查询非常慢!
SELECT A.electric_machine mc,A.electric_imptwh meter,
DATE_FORMAT(FROM_UNIXTIME(A.electric_gts),'%Y-%m-%d %H:%i') dt,
(
SELECT electric_imptwh
FROM electric_meter
WHERE electric_machine = 'MPR93'
AND DATE(FROM_UNIXTIME(electric_gts)) = DATE(NOW() - INTERVAL 2 DAY)
AND DATE_FORMAT(TIME(FROM_UNIXTIME(electric_gts)),'%H:%i') = DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(A.electric_gts),INTERVAL 15 MINUTE),'%H:%i')
) meter2,
DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(A.electric_gts),INTERVAL 15 MINUTE),'%Y-%m-%d %H:%i') dt2
FROM electric_meter A
WHERE A.electric_machine = 'MPR93'
AND DATE(FROM_UNIXTIME(A.electric_gts)) = DATE(NOW() - INTERVAL 2 DAY)
AND
(
(DATE_FORMAT(TIME(FROM_UNIXTIME(A.electric_gts)),':%i') = ':00') OR
(DATE_FORMAT(TIME(FROM_UNIXTIME(A.electric_gts)),':%i') = ':15') OR
(DATE_FORMAT(TIME(FROM_UNIXTIME(A.electric_gts)),':%i') = ':30') OR
(DATE_FORMAT(TIME(FROM_UNIXTIME(A.electric_gts)),':%i') = ':45')
)

发布于 2022-12-02 20:43:03
这些日期表达式中有许多不必要的复杂,它们防止使用任何索引。
你只想要两天前的数据?也不是昨天?
例如,我们的目标是避免围绕任何列名进行函数调用:
DATE(FROM_UNIXTIME(A.electric_gts)) = DATE(NOW() - INTERVAL 2 DAY)-->
A.electric_gts >= CURDATE() - INTERVAL 2 DAY
AND A.electric_gts < CURDATE() - INTERVAL 1 DAY根据数据类型,可能需要
A.electric_gts >= UNIX_TIMESTAMP(CURDATE() - INTERVAL 2 DAY)
AND A.electric_gts < UNIX_TIMESTAMP(CURDATE() - INTERVAL 1 DAY)并具有以下两个索引:
INDEX(electric_machine, electric_gts, electric_imptwh)
INDEX(electric_gts)您可以使用包含unix_timestamp % (15*60) = 0的表达式检查四分之一小时的值。但是,没有桌子,我就不能说得更具体了。
可能读数不是在一分钟内就会出现吗?比如"23:15:02"?如果是这样的话,我将提供一个稍微混乱的表达式来处理这种情况。
https://stackoverflow.com/questions/74652295
复制相似问题