MySQLには、ファイルに関する情報を含む非常に大きなテーブル(〜1億レコード)があります。情報の1つは、各ファイルの変更日です。
指定した日付範囲に収まるファイルの数をカウントするクエリを作成する必要があります。そのために、これらの範囲(すべて日単位)を指定する小さなテーブルを作成しました。これは次のようになります。
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
ただし、予想どおり、このクエリの実行には永遠に時間がかかります。これは、MySQLにHugeFileTableを5回実行するように要求しているためだと思います。そのたびに、各ファイルに対してDATEDIFF()計算を実行します。
代わりに、HugeFileTableレコードをレコードごとに1回だけ調べ、ファイルごとに適切なrange_nameの現在の合計でカウントをインクリメントします。どうすればいいのかわからない…。
誰かがこれを手伝うことができますか?
ありがとう。
編集: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