Mysql 优化查询以查找订单之间的最大时间跨度
有了这个疑问Mysql 优化查询以查找订单之间的最大时间跨度,mysql,sql,query-optimization,Mysql,Sql,Query Optimization,有了这个疑问 SELECT o1.created, SEC_TO_TIME(TIMESTAMPDIFF(second, o1.created, (SELECT MAX(created) FROM orders o2 WHERE o2.created < o1.created and o2.created >= '2012-06-01'))) tsd FROM orders o1 WHERE o1.created >= '2012-06-01' ORDER BY tsd DESC
SELECT
o1.created,
SEC_TO_TIME(TIMESTAMPDIFF(second, o1.created, (SELECT MAX(created) FROM orders o2 WHERE o2.created < o1.created and o2.created >= '2012-06-01'))) tsd
FROM
orders o1
WHERE o1.created >= '2012-06-01'
ORDER BY tsd DESC LIMIT 100
创建的类型为timestamp
查询现在运行了一个多小时。更改模式中的任何内容都不是选项。这是一个一次性查询,但我只是想知道是否可以提高性能。我会尝试使用无子查询的解决方案:
select o1.created, TIMESTAMPDIFF(second, o1.created, o3.created) tsd
from orders o1
inner join orders o2 on o2.created < o1.created and o2.created >= '2012-06-01'
left join orders o3 on o3.created > o2.created
where o1.created >= '2012-06-01' and o3.id is null;
若将创建的列编入索引,速度可能会快得多。但是,我担心在mysql中无法索引按差异列排序。尝试使用此查询。速度快吗
您正在扫描250万行250万次,我会考虑自加入而不是细分,可以将另一列添加到订单中,然后插入新订单时,更新以前的订单,并用它们之间的时差来更新?订单写入速度会稍微慢一点,但查找差异的速度应该会快得多!不过,这对目前的情况没有帮助。我可以回去住suppose@cosmorogers更改模式中的任何内容都不是选项。无论如何,这是一个一次性查询。我只是好奇。但是谢谢您的输入。@Alex您能告诉我您将如何编写查询吗?按照我的写作方式,我看不出有什么好处。太棒了,速度快得难以置信。非常感谢你。
select o1.created, TIMESTAMPDIFF(second, o1.created, o3.created) tsd
from orders o1
inner join orders o2 on o2.created < o1.created and o2.created >= '2012-06-01'
left join orders o3 on o3.created > o2.created
where o1.created >= '2012-06-01' and o3.id is null;
select created,Previous_created,
IF(tsd<>0,SEC_TO_TIME(tsd),0) as diff
from
(
select created,
IF(@prev<>0,TIMESTAMPDIFF(second, @prev,created),0) tsd,
@prev Previous_created,
@prev:=created f2
from orders,(select @prev:=0) t1
WHERE created >= '2012-06-01'
order by created
) t2
order by tsd desc limit 100