我有一个包含约 1000 万个条目的数据库,每个条目都包含一个存储为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
除了将年、月和日信息存储在单独的列中之外,有没有一种方法可以加快查询速度和/或避免临时表和文件排序?