私は、次の列を持つテーブルを持っています:incident_id
、creation_date
、event_id
、signature_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)ですが、各時間範囲でどのように計算するのか分かりません。
質問には索引付けの完全な欠如が含まれていると言われていますが、おそらくOPは少なくともインデックスを追加すると他の理由で役立つはずですが、 –
それに基づいて、私は彼らが実際に[アーカイブ](http://stackoverflow.com/questions/7724824/move-rows-from-tablea-into-table-archive)のようなものを探していたり、新しい行を置いていると思います最初にいくつかの「未処理」テーブルに追加します。必要に応じて、2つのテーブルをビューで結合してシームレスに見えるようにします(ただし、これを完全な答えにするための状況については十分に分かりません)。 –
@ LukeBriggs - あなたの考えに基づいて答えを提供してください。 –