我在一个简单的表上执行一个非常简单的选择,我过滤的列有一个索引。
这是架构:
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)
答案 0 :(得分:1)
因为MySQL的算法告诉它准备索引并使用它会比使用没有索引的查询使用更多的资源。
当您将查询语法提供给DBMS时,它所做的一件事就是尝试确定处理查询的最有效方法(通常至少有几十种方法)。
如果您愿意,可以使用FORCE INDEX(transmission_id)
(documented here)来告知MySQL假设表格扫描非常昂贵,但不建议您确定20行,它没有价值。