2011-04-27 72 views
0

为什么在我切换到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'

回答

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

+0

检查的文章... – cmancre 2011-04-27 11:33:05

+0

这是“为什么MySQL不使用我的索引?”与最相关的部分 – 2011-04-27 11:38:10

+0

好的文章。当然,我必须在这个主题上挖掘更多。这件事并非微不足道。谢谢詹姆斯 – cmancre 2011-04-27 11:50:30