MySQLのファイルに関する情報を含む非常に大きなテーブル(〜100Millionレコード)があります。情報の1つは、各ファイルの修正日です。MySQL集計クエリの最適化
指定した日付範囲に収まるファイルの数をカウントするクエリを作成する必要があります。
DateRanges
range_id range_name range_start range_end
1 0-90 0 90
2 91-180 91 180
3 181-365 181 365
4 366-1095 366 1095
5 1096+ 1096 999999999
そして、このようなクエリを書いた:私はこれらの範囲(すべての日で)を指定すると、このようになります小さなテーブル作られていることを行うにはしかし、かなり予想通り
SELECT r.range_name, sum(IF((DATEDIFF(CURDATE(),t.file_last_access) > r.range_start and DATEDIFF(CURDATE(),t.file_last_access) < r.range_end),1,0)) as FileCount
FROM `DateRanges` r, `HugeFileTable` t
GROUP BY r.range_name
を、このクエリは永遠に実行されます。私は、毎回HugeFileTableを5回実行するようにMySQLに依頼しているので、毎回DATEDIFF()計算を各ファイルで実行するためだと思います。
私が代わりにやりたいのは、レコードでHugeFileTableレコードを1回だけ調べ、ファイルごとに適切なrange_nameの合計をインクリメントすることです。私はそれを行う方法を理解することはできません....
誰もこれで助けることができますか?
ありがとうございました。
EDIT:MySQLバージョン:5.0.45、テーブルはMyISAMテーブル
EDIT2、次のとおりです。ここではまあコメント
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE r ALL NULL NULL NULL NULL 5 Using temporary; Using filesort
1 SIMPLE t ALL NULL NULL NULL NULL 96506321
使用しているMySQLのバージョンは? –
DESCRIBEをクエリの前で実行して、出力が得られるので、ここに改善が必要なものがあるかどうかを確認できます – tristanbailey