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

createdタイプtimestampです。

クエリは1時間以上実行されます。スキーマ内の何かを変更することはオプションではありません。これは1回限りのクエリですが、パフォーマンスを向上させることができるかどうかだけが気になります。

4

2 に答える 2

1

このクエリを使用してみてください。速いですか?

SQLFiddleデモ

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
于 2012-12-13T13:39:35.300 に答える
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列にインデックスが付けられていると、はるかに高速になる可能性があります。ただし、mysqlではdiff列による順序付けにインデックスを付けることができないのではないかと思います。

于 2012-12-13T13:14:33.820 に答える