MySql查询需要60多秒才能执行。如何提高绩效
我编写了一个查询来选择所有行,其中前一行中“gvA”列的值为0,而当前行中的值为非零。但我的问题是这个查询执行起来太长了。 我的表有40000行,查询大约需要60-65秒,这对于查询来说太多了。如何改进查询以获得更好的性能MySql查询需要60多秒才能执行。如何提高绩效,mysql,Mysql,我编写了一个查询来选择所有行,其中前一行中“gvA”列的值为0,而当前行中的值为非零。但我的问题是这个查询执行起来太长了。 我的表有40000行,查询大约需要60-65秒,这对于查询来说太多了。如何改进查询以获得更好的性能 SELECT device_no,datetime FROM ( SELECT gvA, (SELECT e2.gvA FROM tyn_records e2 WHERE e2.tyn_id < e1.tyn_id O
SELECT device_no,datetime
FROM (
SELECT
gvA,
(SELECT e2.gvA
FROM tyn_records e2
WHERE e2.tyn_id < e1.tyn_id
ORDER BY tyn_id DESC LIMIT 1) as previous_value,
datetime,
device_no
FROM tyn_records e1
WHERE gvA > 0 AND DATE(datetime) = CURDATE() - INTERVAL 2 DAY
) selected
WHERE selected.previous_value = 0
下面是我的桌子
设备:
天佑唱片公司:
我会做两件事:
我将稍微重新表述一下查询,特别是删除过滤条件左侧的DATE函数
select
device_no,
datetime
from (
select
gva,
lag(gva) over(order by tyn_id) as previous_value,
datetime,
device_no
from tyn_records
where gva > 0
and datetime between curdate() - interval 2 day
and curdate() - interval 1 day
) x
where previous_value = 0
删除谓词左侧的函数后,可以创建适合优化查询的索引:
create index ix1 on tyn_records (datetime, gva);
作为旁注,您计算上一个_值的方式可能不是确定性的,并且每次运行查询时可能会产生不同的结果。如果列tyn_id不唯一,则可能发生这种情况。请包括解释结果,并在tyn_记录表中列出所有索引。您的所有日期字段是否仅为日期而非日期/时间?换句话说,您的列是否也包含实际时间组件。您还引用了最外层结果中的设备,但内部没有设备上下文-除非gvA是您正在引用的设备。我添加了表的图像,希望您从M1064获得所需信息-您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以获得正确的语法,以便在第行使用“order by tyn_id as‘previous_value’、datetime、device_no from tyn”7@ZeeshanCh如果您遇到这个错误,那么可能您的MySQL版本比8.x旧。如果是这种情况,那么用答案中的子查询替换由tyn_id组成的laggva overorder部分。