我一直在玩弄于天,这个查询条件和限制较少,MySQL的没有完成的执行比巨大的表
select slno,Power_Factor_L32_Avg
from power_logger pl
where (pl.slno between 1851219 and 2042099)
and meter_id="logger1"
and pl.Power_Factor_L32_Avg is not null
and case when (((pl.slno=1851219)
and ((pl.Power_Factor_L32_Avg) not between 0.400 and 1.000))
or ((pl.slno=2042099) and
((pl.Power_Factor_L32_Avg) not between 0.400 and 1.000))
or ((pl.Power_Factor_L32_Avg not between 0.400 and 1.000) and
(((select p2.Power_Factor_L32_Avg
from power_logger p2
where p2.slno=(select slno
from power_logger
where slno>pl.slno
and Power_Factor_L32_Avg is not null
order by slno asc limit 1))
between 0.400 and 1.000)
or ((select p4.Power_Factor_L32_Avg
from power_logger p4
where p4.slno=(select slno
from power_logger
where slno<pl.slno
and Power_Factor_L32_Avg is not null
order by slno desc limit 1))
between 0.400 and 1.000))))
then (case when (((pl.slno=1851219)
and ((select p10.Power_Factor_L32_Avg
from power_logger p10
where p10.slno=pl.slno+1) is null
or (select p10.Power_Factor_L32_Avg
from power_logger p10
where p10.slno=pl.slno+1) between 0.400 and 1.000))
or (((select p5.Power_Factor_L32_Avg
from power_logger p5
where p5.slno=(select slno
from power_logger
where slno<pl.slno
and Power_Factor_L32_Avg is not null
order by slno desc limit 1))
between 0.400 and 1.000)
and ((select p6.Power_Factor_L32_Avg
from power_logger p6
where p6.slno=(select slno
from power_logger
where slno>pl.slno
and Power_Factor_L32_Avg is not null
order by slno asc limit 1))
between 0.400 and 1.000)))
then 0=1
else 1
end)
else 0=1
end
order by slno asc
这将是很难理解在查询但是它正在查询一张拥有数百万条记录的表格。这里唯一的问题是嵌套查询“select slno from power_logger where slno<pl.slno and Power_Factor_L32_Avg is not null order by slno desc limit 1
”和“select slno from power_logger where slno>pl.slno and Power_Factor_L32_Avg is not null order by slno desc limit 1
”,它用于查找分别具有非空值的当前记录的前一记录和下一记录的序列号(slno)。当这些查询本身运行时,它会在几微秒内给出序列号,但是当包含在上面的查询中时,它会弄乱整个事情,并且该过程需要被明确地杀死。 如果不使用嵌套查询,则上面的查询执行时间少于1.5秒,而是由下一个/前一个序列号替换,而不管它是否为空。
这不会去任何地方。感谢有人能帮助我。
通过使用临时表新建查询,
create temporary table temp(
id int auto_increment
,slno int
,pf decimal(10,4)
,primary key(id)
);
insert into temp(slno,pf)
(select slno,Power_Factor_L32_Avg
from power_logger
where slno between 1851219 and 2042099
and meter_id='logger1'
and Power_Factor_L32_Avg is not null);
select pl.slno,pl.Power_Factor_L32_Avg,t1.slno,t1.pf
from power_logger pl
left join temp t1 on t1.slno>pl.slno
where pl.slno between 1851219 and 2042099 and pl.meter_id='logger1'
and pl.Power_Factor_L32_Avg is not null;
这是测试如果下slno
其中功率因数为空与slno
从power_logger表一起取出。这也不起作用。我不确定是否有任何其他解决方法可以在不使用大于号的情况下获得下一个slno
。
尝试将它们更改为“SELECT TOP 1”,而不是在最后加上“LIMIT 1”。这可能是MySQL可以更好地优化这些子查询,然后你不会看到如此大的放缓。 – Hbcdev
@Hbcdev:感谢您的快速回复。我得到了使用TOP 1的语法错误。我以前没有使用它,我想它只适用于transact sql。 – Rohith
对不起,你是对的。 – Hbcdev