在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
在我的研究中,我找到了
EXPLAIN
的输出有时会产生误导。例如,
filesort
与文件无关,using where
并不意味着您使用WHERE
子句,而using index
可以 显示在没有定义单个索引的表上。
Using where
只是意味着桌子上有一些限制条款 (WHERE
或ON
),并非所有记录都会被退回。注意LIMIT
不算作限制条款(尽管可以)。
Using index
表示从索引返回所有信息, 没有寻求表中的记录。这是唯一可能的 索引所涵盖的字段包含在内。由于您选择
*
,这是不可能的。除了以外的领域category_id
,board_id
,display
和order
不在其中 索引,应该查找。
我也找到了
使用索引
仅使用表格检索列信息 索引树中的信息,无需进行额外的搜索 阅读实际的行。查询使用时可以使用此策略 只有属于单个索引的列。
如果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
有什么区别?
(我没有添加一个这样的例子,因为我无法在一个小的自包含的片段代码中重现它)
答案 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,然后应用大于条件来过滤掉与条件不匹配的记录