2016-09-10 6 views
0

は私が分析するように設定された時間系列データを持っていますが、難易度は行間計算の前にレコードをソートするオプションは何ですか?

  1. データセットが非常に大きいということです。
  2. 時系列イベントは、所属する異なるオブジェクトによってコミットされます。
  3. そのMySQLでは、

などに参加するインデックス列のような全くIDが存在しません私はそれぞれの間の遅延を知るしようとしています

---------------- 
dt  obj  comp 
---------------- 
t1, object_a, component_1 
t2, object_b, component_1 
t3, object_c, component_3 
t4, object_a, component_1 
t5, object_c, component_2 
t6, object_b, component_3 
---------------- 

は、各オブジェクトの各コンポーネントから をコミットします。 すなわち obj_a.comp_1.delay1 = obj_a.compoent_1.t4 - obj_a.component_1.t1

など

私は

select timediff(t1.dt, t.dt) as delay 
from table as t 
join table as t1 
on t1.dt = (
    select min(t2.dt) 
    from table as t2 
    where t2.obj = t.obj 
    and t2.comp = t.comp 
    and t2.dt > t.dt 
) 

に参加しようとしたが、それは永遠に取っているので、私は結果をソートして変数を使って行間計算を行う方法があれば、はるかに速くなるだろうと考えています。 ですが、サブクエリとビューのすべての方法で失敗しました。ソートは計算後に常に行われます。私がorder byで読んだところから、それは不可能と思われます。だから私はこれを合理的に速く達成するためにどのような選択肢が必要ですか?

答えて

0

あなたの構造に固執します。あなたはtable(obj, comp, dt)のインデックスをしたい、この構造で、その後

select timediff(t1.dt, t.dt) as delay 
from table t join 
    table t1 
    on t1.obj = t.obj and t1.comp = t.comp and 
     t1.dt = (select min(t2.dt) 
        from table t2 
        where t2.obj = t.obj and 
         t2.comp = t.comp and 
         t2.dt > t.dt 
       ); 

:あなたはjoin条件が欠落しています。

これはあなたの構造です。より簡単な方法では、サブクエリを使用します。

select timediff((select min(t2.dt) 
        from table t2 
        where t2.obj = t.obj and 
         t2.comp = t.comp and 
         t2.dt > t.dt 
       ), 
       t.dt 
       ) as delay 
from table t; 

同じインデックスが必要です。

dt以外の一致する行の他の列が必要な場合は、joinメソッドが必要です。

+0

問題を修正していただきありがとうございます。後者のバージョンは結合バージョンよりもわずかに速く実行されます。それでもまだ多くの時間ペナルティがあります。最初のものは22分、後者は16分かかります。 – Ben

+0

(上記の時間は、objとcompキーに基づいてレコードをソートすることも含みます)。しかし、レコードを最初にソートして、テンポラリテーブルに入れて順序を保持し、行内減算を行うとわずか5分しかかかりません。結果は同じです。 (ソートの際のいくつかの脅威の結果を除いて)。私は一時的なテーブルのアイデアを多大な時間のペナルティなしに避けることができるかどうかまだ不思議です。 – Ben

+0

@Ben。 。 。インデックスを作成しましたか? –

関連する問題