【问题标题】:MySQL Index UsageMySQL 索引使用情况
【发布时间】:2013-04-22 09:55:28
【问题描述】:

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

这是架构:

 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)

【问题讨论】:

  • 可能是因为行数没有达到需要索引的阈值?

标签: mysql sql performance


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 2022-01-05
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多