約1,000万のエントリのデータベースがあり、各エントリにはDATEとして保存された日付が含まれています。
一意でないBTREEを使用してその列にインデックスを付けました。
個別の年ごとにエントリ数をカウントするクエリを実行しています。
SELECT DISTINCT(YEAR(awesome_date)) as year, COUNT(id) as count
FROM all_entries
WHERE awesome_date IS NOT NULL
GROUP BY YEAR(awesome_date)
ORDER BY year DESC;
クエリの実行には現時点で約90秒かかり、EXPLAIN出力はその理由を示しています。
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
----------------------------------------------------------------------------------------------------------------------------------------
1 | SIMPLE | all_entries | ALL | awesome_date | | | | 9759848 | Using where; Using temporary; Using filesort
行をドロップする場合FORCE KEY(awesome_date)
、行は最大800万にカウントダウンされますkey_len = 4
が、それでもUsing where; Using temporary; Using filesort
です。
また、クエリを選択DISTINCT(MONTH(awesome_date))
して実行DISTINCT(DAY(awesome_date))
し、関連するWHERE
条件を使用して、特定の年または月に制限します。
年、月、日の情報を別々の列に保存する以外に、このクエリを高速化したり、一時テーブルやファイルソートを回避したりする方法はありますか?