2013-04-22 54 views
4

我正在通过一个简单的表执行一个非常简单的选择,其中我要过滤的列有一个索引。MySQL索引使用

这里是架构:

CREATE TABLE IF NOT EXISTS `tmp_inventory_items` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `transmission_id` int(11) unsigned NOT NULL, 
    `inventory_item_id` int(11) unsigned DEFAULT NULL, 
    `material_id` int(11) unsigned NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `transmission_id` (`transmission_id`) 
    KEY `inventory_item_id` (`inventory_item_id`), 
    KEY `material_id` (`material_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ; 

这里是SQL:

SELECT * FROM `tmp_inventory_items` WHERE `transmission_id` = 330 

然而,解释查询,我看到一个没有被使用的索引时,这是为什么 (该表在我的本地机器上有大约20行)?

id select_type table     type possible_keys key  key_len ref  rows Extra 
1 SIMPLE  tmp_inventory_items... ALL  transmission_id NULL NULL NULL 13  Using where 

即使我暗示与USE INDEX(transmission_id)mysql的无键被使用......这在我看来很奇怪(MySQL版本5.5.28)

+4

可能是因为行计数没有达到它会觉得需要索引的阈值? – Amit 2013-04-22 09:58:32

回答

1

因为MySQL的算法,告诉它准备一个索引并使用它将比没有一个简单地执行查询使用更多的资源。

将查询语法提供给DBMS时,它所做的一件事就是尝试确定处理查询的最有效方式(通常至少有几十种方法)。

如果你愿意,你可以使用FORCE INDEX(transmission_id)documented here),它会通知MySQL,表扫描被认为是非常昂贵的,但不推荐用于确定20行,它只是没有价值。