我的简单MySql查询不使用索引

Msc*_*iot 8 mysql indexing select

我有一个非常简单的查询:

  SELECT   comments.*
  FROM comments 
  WHERE comments.imageid=46
Run Code Online (Sandbox Code Playgroud)

这是我的表:

CREATE TABLE IF NOT EXISTS `comments` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `imageid` int(10) unsigned NOT NULL DEFAULT '0',
  `uid` bigint(20) unsigned NOT NULL DEFAULT '0',
  `content` text CHARACTER SET utf8,
  `adate` datetime DEFAULT NULL,
  `ip` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `ids` (`imageid`) USING BTREE,
  KEY `dt` (`adate`) USING BTREE
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;
Run Code Online (Sandbox Code Playgroud)

但是MySql不能在这个简单的查询上使用索引.这是解释结果:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    filtered    Extra
1   SIMPLE  comments    ALL     ids     NULL    NULL    NULL    4   75.00   Using where
Run Code Online (Sandbox Code Playgroud)

当我将查询更改为此时,Mysql可以使用索引.为什么?:

  SELECT   comments.id
  FROM comments 
  WHERE comments.imageid=46
Run Code Online (Sandbox Code Playgroud)

这是解释:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    filtered    Extra
1   SIMPLE  comments    ref     ids     ids     4   const   4   100.00  Using index
Run Code Online (Sandbox Code Playgroud)

jor*_*deu 7

我猜你在'comments'表中有几行,这就是MySQL在你的第一个查询中进行全表扫描而不是使用索引的原因.它估计全表扫描的成本可能低于首先匹配索引然后查找行.

在您的第二个查询中使用索引,因为可以直接从索引获取查询的所有列('id'列),而不需要在匹配索引后查找表行.这是"使用索引"额外信息的含义.

尝试在"评论"中使用大量行仍然使用完全扫描,我认为这将是一种奇怪的行为.事实上,我在MySQL版本5.1中测试完全相同,即使只有很少的行,它总是使用'​​索引'.