Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 优化查询以查找订单之间的最大时间跨度_Mysql_Sql_Query Optimization - Fatal编程技术网

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