3

何十万ものエントリを含む MySQL テーブルがあります。

日付範囲を指定し、それら 2 つの日付の間のすべてのエントリを選択する必要があります。次に、エントリを 1 時間ごとに分類し、特定のフィールドを取得する必要があります。

ユース ケース: 6 月 6 日から 6 月 12 日までのエントリの 1 時間ごとの内訳が必要です。したがって、6 月 6 日には、午前 12 時から午前 1 時、午前 1 時から午前 2 時、午前 2 時から午前 3 時などのエントリの配列が必要になります。

どちらが速いですか?(なぜ!):

  1. 144 個の SQL クエリを実行するSELECT device_id FROM entries WHERE updated_at >= sometime AND updated_at <= sometime+1.hourと、午後 12 時から午後 1 時、午後 1 時から午後 2 時などのようになります。

  2. 1 つの SQL クエリを実行して、期間SELECT device_id FROM entries WHERE updated_at >= start_date AND updated_at <= end_date内のすべてのエントリを取得し、 ruby を使用してエントリを時間ごとにグループ化します。

ruby や MySQL がこの種のものに対してなぜ高速なのかについてのリソースを誰かが持っていれば、それは大歓迎です。いくつかの読書をしたいと思います。

4

2 に答える 2

2

SQL データベースは、このような操作のために構築されています。それらを使用してください!いつでもいくつかのベンチマークを実行できますが、結果は非常に予測可能に思えます。

于 2013-06-12T18:45:14.283 に答える
1

これを行う最善の方法は、ログを挿入するときに updated_at_month、updated_at_day、updated_at_hour (TINYINT - すべての値が非常に小さいため) INDEXED フィールドを用意し、範囲を選択して次のようにグループ化することだと思います。

select device_id FROM logs where updated_at BETWEEN sometime AND some_other_time group by updated_at_month, updated_at_day, updated_at_hour

updated_at はインデックス付きフィールドだと思います。

また

select device_id FROM logs where updated_at_month=6 and updated_at_day>=6 and updated_at_day<=12 group by updated_at_day, updated_at_hour

しかし、合計で何行について話しているのでしょうか? そして、私が気づいたように、カウントなしでそこからdevice_idフィールドを選択します...またはグループ...おそらくそうすべきですselect device_id, updated_at_day,updated_at_hour, count(*) as times

于 2013-06-12T19:19:22.797 に答える