当我切换到1年范围时,为什么MySQL搜索所有行?
--Table dates
id (int)
date (timestamp)
value (varchar)
PRIMARY(id), date_index(date)
1750行
执行
EXPLAIN SELECT * FROM dates WHERE date BETWEEN '2011-04-27' AND '2011-04-28'
行列显示 18行 如果我增加或减少BETWEEN范围 - 例如1年 - 行列显示 1750行。
EXPLAIN SELECT * FROM dates WHERE date BETWEEN '2011-04-27' AND '2012-04-28'
EXPLAIN SELECT * FROM dates WHERE date BETWEEN '2010-04-27' AND '2011-04-28'
答案 0 :(得分:1)
优化器根据包括数据量/分布在内的几个方面构建查询计划。我最好的猜测是你没有超过一年的数据,或者使用年份数据的索引不会使用比总表数量少得多的行。
如果听起来不对,你可以发布输出:
SELECT MIN(date), MAX(date) FROM dates;
SELECT COUNT(*) FROM dates WHERE date BETWEEN '2011-04-27' AND '2012-04-28';
我写的这篇文章展示了优化器如何工作的一些示例:What makes a good MySQL index? Part 2: Cardinality