2016-12-22 31 views
0

私は、次の列を持つテーブルを持っています:incident_idcreation_dateevent_idsignature_idです。MySQLクエリのパフォーマンス(日付範囲と時間ステップ)

このサブルーチン(簡易版)は、テーブルを照会します。

while time1 < end_date and time2 < end_date do 
    stmt = "SELECT incident_id, COUNT(event_id) AS total 
     FROM table 
     WHERE creation_date BETWEEN #{time1} AND #{time2} 
     AND signature_id IN (29476,9935,16353,35726,40340,45471,36047, 
           105630,105730,73274) 
     GROUP BY signature_id " 
    results = db_connect.fetch_all(stmt) 
    foreach result in results do 
    ... some post processing ... 
    end 
    time1 = time1 + time_step 
    time2 = time2 + time_step 
end 

これに伴う問題は、列がインデックス付けされていないで、行の数が多いので、性能は今本当に悪いということです。ループ内で結果をフェッチせずにクエリを実行する方法はありますか?

更新:最初にループの時間範囲を事前に計算してから、すべてのSQLクエリでORを実行する必要があります。唯一の問題はCOUNT(event_id)ですが、各時間範囲でどのように計算するのか分かりません。

答えて

0

は、この複合インデックスを追加します。

INDEX(signature_id, creation_date) 

あなたは、単一のクエリ内のすべてのデータを集めることができました。それはあなたが探しているものですか?もしそうなら、あなたは

GROUP BY signature_id, some_function(creation_date) 

ようなものが必要some_functionの背後にある考え方は、時間がかかるtime_stepによる除算、およびグループ化のためにそれを使用することです。 DAYのような単純なものなら、LEFT(creation_date, 10)またはDATE(creation_date)は単純です。それ以外の場合は、ユースケースを詳しく説明してください。

+0

質問には索引付けの完全な欠如が含まれていると言われていますが、おそらくOPは少なくともインデックスを追加すると他の理由で役立つはずですが、 –

+0

それに基づいて、私は彼らが実際に[アーカイブ](http://stackoverflow.com/questions/7724824/move-rows-from-tablea-into-table-archive)のようなものを探していたり​​、新しい行を置いていると思います最初にいくつかの「未処理」テーブルに追加します。必要に応じて、2つのテーブルをビューで結合してシームレスに見えるようにします(ただし、これを完全な答えにするための状況については十分に分かりません)。 –

+0

@ LukeBriggs - あなたの考えに基づいて答えを提供してください。 –