EXPLAIN 中的“Using index”和“Using where; Using index”有啥区别

Posted

技术标签:

【中文标题】EXPLAIN 中的“Using index”和“Using where; Using index”有啥区别【英文标题】:Whats the difference between "Using index" and "Using where; Using index" in the EXPLAINEXPLAIN 中的“Using index”和“Using where; Using index”有什么区别 【发布时间】:2014-09-04 18:24:18 【问题描述】:

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 列也显示 Using where,则表示索引正在 用于执行键值的查找。如果不使用 where,则 优化器可能正在读取索引以避免读取数据行但不是 使用它进行查找。例如,如果索引是覆盖索引 对于查询,优化器可能会扫描它而不使用它进行查找。

对于具有用户定义聚集索引的 InnoDB 表,该索引 即使 Extra 列中没有 Using index 也可以使用。 如果 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; 是什么意思?它不在第一个查询中的事实是什么意思?


额外

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

【问题讨论】:

***.com/questions/1687548/… 回应额外的。 (之前没找到,因为看的是旧版的mysql文档 【参考方案1】:

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

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

【讨论】:

只是为了检查:SELECT id FROM test WHERE id > 5; 不会从磁盘读取行,是吗?此外,在这两种情况下,mysql 覆盖索引的相同部分并在 btree 中获取相同的值。有什么重要的计算差异吗? 另一个细节,只是为了补充您的回复。键的唯一状态不影响。 alter table test add key another_fileld(another_field); explain select another_field from test where another_field = 0 仅返回 Using index @J-Rou:不,它不访问HD.Computational有什么区别? The uniqe status of the key doesnt affect. 不是,我只是跟大家提了PK是怎么实现的 如果它说使用where;使用索引?

以上是关于EXPLAIN 中的“Using index”和“Using where; Using index”有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查询优化概念辨析---Using where 和 Using index

MySQL查询优化概念辨析---Using where 和 Using index

MySQL 执行计划中Extra(Using where,Using index,Using index condition,Using index,Using where)的浅析

oracle唯一索引与普通索引的区别和联系以及using index用法

MySQL中的explain解析

MySQL中的explain解析