4

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

这是架构:

 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

1 回答 1

1

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

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

如果你愿意,你可以使用FORCE INDEX(transmission_id)记录在这里)这将通知 MySQL 一个表扫描被认为是非常昂贵的,但不建议确定 20 行,它只是没有价值。

于 2013-04-22T10:27:34.927 回答