在mysql的explain中的额外字段中,你可以得到:
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
在我的研究中,我发现:
为什么这个查询使用了 where 而不是 index?
EXPLAIN
的输出有时会误导。例如,
filesort
与文件无关,using where
并不意味着使用了WHERE
子句,而using index
可能 出现在表上,即使没有定义单个索引。
Using where
只是表示在表上有某些限制性子句(WHERE
或ON
),并且不会返回所有记录。请注意,LIMIT
不计算为限制性子句(但它可以)。
Using index
表示从索引中返回了所有信息,而不需要在表中查找记录。这仅在查询所需的所有字段都被索引覆盖时才可能实现。由于您选择了
*
,这是不可能的。除了category_id
、board_id
、display
和order
之外的字段未被索引覆盖,必须进行查找。
并且我还发现:
https://dev.mysql.com/doc/refman/5.1/en/explain-output.html#explain-extra-information
Using index
仅使用索引树中的信息从表中检索列信息,而不必进行额外的搜索才能读取实际行。当查询仅使用单个索引的列时,可以使用这种策略。
如果“Extra”列还说“Using where”,则表示正在使用索引来执行关键值的查找。如果没有使用 where,则优化器可能会读取索引以避免读取数据行, 但不使用它进行查找。例如,如果该索引是查询的覆盖索引,则优化器可能会在不使用它进行查找的情况下扫描它。
对于具有用户定义的聚集索引的 InnoDB 表,即使 Extra 列中缺少 Using index,也可以使用该索引。如果类型为 index 并且键为 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
(向右滚动)
除了一个查询使用范围搜索而另一个使用常量搜索之外,两个查询都在表上使用了某些限制性子句(WHERE或ON),并且不会返回所有记录。
第二个查询中的 Using where;
是什么意思?而第一个查询没有这个是什么意思?
额外内容:
Using index condition; Using where
有什么区别?
(我没有在一个小型自包含代码片段中重现它的示例)