为什么在表中定义的索引没有被查询优化器使用? (MySQL的)

问题描述:

我有以下模式为什么在表中定义的索引没有被查询优化器使用? (MySQL的)

CREATE TABLE `test` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `d` date NOT NULL, 
    `y` year(4) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `y` (`y`) 
) ENGINE=MyISAM CHARSET=utf8; 

当我运行 “解释SELECT * FROM测试其中y = '2010';”

虽然表中为列“y”定义了一个索引,但查询优化器未使用该索引。

可能是什么原因?

+0

表中有多少行?仅仅因为MySQL可用,MySQL没有义务使用索引。 – 2014-10-08 11:26:30

+0

我的行是70,000 – 2014-10-08 11:28:09

+0

是什么?一年是内置的MYSQL类型,请查看此链接http://dev.mysql.com/doc/refman/5.0/en/year.html – 2014-10-08 11:32:49

MySQL必须使用索引找到它的价值。

当dbms期望找到几条记录时通常会出现这种情况。即使是所有记录中低至10%甚至5%的记录也可能被视为太多,而dbms决定更好地浏览整个表格,而不必在整个索引中混淆。

所以答案是:MySQL认为它不适合在这里使用索引。它认为全表扫描可能更快。

+0

感谢您的回复,但Mysql如何适当呢?我的问题是,因为我在模式中表示,我希望有一年的时间作为关键字,并在接近的地方使用它,因此Mysql似乎必须使用和索引。 – 2014-10-08 12:28:46

+1

您的表中有70000条记录。这并不多,可以快速阅读。另一方面,使用索引可能非常缓慢。你的桌子有多少年?如果有70000年不同的年份,我肯定会说使用索引。一万年之后,我仍然会说使用这个指数。但只有100年不同的情况下,我会假设全表扫描更简单得多。 – 2014-10-08 12:42:15

+0

SELECT DISTINCT y FROM test; + ------ + |年| | + ------ + | 2008 | | 2009 | | 2010 | | 2011 | | 2012 | | 2013 | | 2014 | + ------ + – 2014-10-08 12:54:50