什么是EXPLAIN中“使用索引”和“使用位置;使用索引”之间的区别

时间:2014-09-04 18:24:19

标签: mysql

在mysql的解释的额外字段中,您可以获得:

  • Using index
  • Using where; Using index

两者之间有什么区别?

为了更好地解释我的问题,我将使用下表:

CREATE TABLE `test` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `another_field` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

INSERT INTO test() VALUES(),(),(),(),();

最终会有以下内容:

SELECT * FROM `test`;

id  another_field
1   0
2   0
3   0
4   0
5   0

在我的研究中,我找到了

Why is this query using where instead of index?

  

EXPLAIN的输出有时会产生误导。

     

例如,filesort与文件无关,using where   并不意味着您使用WHERE子句,而using index可以   显示在没有定义单个索引的表上。

     

Using where只是意味着桌子上有一些限制条款   (WHEREON),并非所有记录都会被退回。注意   LIMIT不算作限制条款(尽管可以)。

     

Using index表示从索引返回所有信息,   没有寻求表中的记录。这是唯一可能的   索引所涵盖的字段包含在内。

     

由于您选择*,这是不可能的。除了以外的领域   category_idboard_iddisplayorder不在其中   索引,应该查找。

我也找到了

https://dev.mysql.com/doc/refman/5.1/en/explain-output.html#explain-extra-information

  

使用索引

     

仅使用表格检索列信息   索引树中的信息,无需进行额外的搜索   阅读实际的行。查询使用时可以使用此策略   只有属于单个索引的列。

     

如果Extra列也显示使用where,则表示索引正在进行   用于执行键值的查找。没有使用的地方,   优化器可能正在读取索引以避免读取数据行而不是   用它来查找。例如,如果索引是覆盖索引   对于查询,优化器可以扫描它而不使用它进行查找。

     

对于具有用户定义的聚簇索引的InnoDB表,该索引   即使Extra列中没有使用索引也可以使用。   如果type是index并且key是PRIMARY,则会出现这种情况。

(看第二段)

我的问题是:

第一:我不理解第二段的写法。

第二

以下查询返回

EXPLAIN SELECT id FROM test WHERE id = 5;

id  select_type table   type    possible_keys   key     key_len ref     rows    Extra
1   SIMPLE      test    const   PRIMARY         PRIMARY 8       const   1       Using index

(向右滚动)

此其他查询返回:

EXPLAIN SELECT id FROM test WHERE id > 5;

id  select_type table   type    possible_keys   key     key_len ref     rows    Extra
1   SIMPLE      test    range   PRIMARY         PRIMARY 8       NULL    1       Using where; Using index

(向右滚动)

除了一个查询使用范围搜索而另一个使用常量搜索这一事实外,两个查询都使用some restricting clause on the table (WHERE or ON), and not all record will be returned

Using where;对第二个查询意味着什么?它不在第一个查询上的意思是什么?


EXTRA

Using index condition; Using where有什么区别? (我没有添加一个这样的例子,因为我无法在一个小的自包含的片段代码中重现它)

1 个答案:

答案 0 :(得分:14)

当你在解释的额外部分看到Using Index时,这意味着(覆盖)索引足以满足查询。
在您的示例中:SELECT id FROM test WHERE id = 5;服务器不需要访问实际表,因为它只能使用索引来满足查询(您只能访问id)(如解释所述)。如果您不知道PK是通过唯一索引实现的。

当您看到Using Index; Using where时,它意味着首先使用索引来检索记录(不需要对表的实际访问),然后在此结果集的基础上过滤where子句。
在此示例中:SELECT id FROM test WHERE id > 5;您仍然从索引中获取id,然后应用大于条件来过滤掉与条件不匹配的记录