2011-10-11 50 views
1

我用EXPLAIN玩,跑了它在这个简单的查询:MySQL的 - 为什么没有这个查询使用索引(按说明)

EXPLAIN SELECT * FROM actions WHERE user_id = 17; 

,并很惊讶看到这样的输出:

select_type SIMPLE 
table   actions 
type   ALL 
possible_keys user_id 
key   null 
key_len  null 
ref   null 
rows   6 
extra   Using where 

我的理解是,这意味着查询中没有使用索引,是正确的吗? (这里只有6行总表中的这个时候都是,但会有更多)

表定义为(inpart):

CREATE TABLE `actions` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `user_id` int(10) unsigned NOT NULL, 
    ... 
    PRIMARY KEY (`id`), 
    KEY `user_id` (`user_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1 

为什么这是不是可以用密钥值在user_id上?

+0

索引现在未被使用的事实并不意味着它将来不会被使用。 – Karolis

+1

在这种情况下扫描6行可能会更快。如果你再添加几百行呢? –

+0

@Karolis没什么意义 - 对主键的查询甚至对6行也使用该索引。 – Will

回答

5

有时MySQL不使用索引,即使有索引可用。这比直接阅读表格需要更少的寻求。看来有6行你就是在这种情况下。

请记住,当您拥有更真实的数据集时,请定期运行OPTIMIZE TABLEANALYZE TABLE

如果您认为自己可以比优化程序做得更好,那么可以使用Index Hint Syntax

+0

注意:InnoDB表不需要分析表。 – Karolis