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'

4

1 回答 1

1

优化器根据包括数据的数量/分布在内的几件事来构建查询计划。我最好的猜测是你没有超过一年的数据,或者使用索引来获取一年的数据不会使用比总表大小少很多的行。

如果这听起来不正确,您可以发布以下输出:

SELECT MIN(date), MAX(date) FROM dates;
SELECT COUNT(*) FROM dates WHERE date BETWEEN '2011-04-27' AND '2012-04-28';

我写的这篇文章也展示了优化器如何工作的一些示例:什么是好的 MySQL 索引?第 2 部分:基数

于 2011-04-27T11:28:05.997 回答