2012-12-13 44 views
0

之间最大时间跨度与此查询优化查询找到订单

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 

我想了解,如果有其中任何订单放在这个时间跨度有多长任何显著倍。

这里的解释:

*************************** 1. row *************************** 
      id: 1 
    select_type: PRIMARY 
     table: o1 
     type: range 
possible_keys: created 
      key: created 
     key_len: 4 
      ref: NULL 
     rows: 2649278 
     Extra: Using where; Using index; Using filesort 
*************************** 2. row *************************** 
      id: 2 
    select_type: DEPENDENT SUBQUERY 
     table: o2 
     type: range 
possible_keys: created 
      key: created 
     key_len: 4 
      ref: NULL 
     rows: 2649278 
     Extra: Using where; Using index 

createdtimestamp类型。

查询现在运行一个多小时。更改架构中的任何内容都不是一种选择。这是一次性查询,但我只是好奇,如果性能可以提高。

+0

您扫描250万行250万次,我会考虑自连接,而不是subquerying – Alex

+0

能插入一个新的秩序更新以前的订单时,另一列添加到订单,然后与他们之间的时差? 订单写入变得稍微慢一点,但您查询发现差异应该快很多! 虽然目前的情况没有帮助。可以返回并填充我认为 – cosmorogers

+0

@cosmorogers更改模式中的任何内容不是一种选择。无论如何,这是一次性查询。我只是好奇。但感谢您的意见。 – fancyPants

回答

1

请尝试使用此查询。速度更快吗?

SQLFiddle demo

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 
+0

太棒了,它的速度令人难以置信。非常感谢。 – fancyPants

0

我会尝试去与解决方案,而子查询:

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; 

这可能是如果created列索引快了很多。恐怕按diff列排序不能在mysql中编入索引。