Mysql 为什么额外的是“使用where;使用索引”而不是“使用索引”
为什么额外使用在哪里;使用索引而不是使用索引Mysql 为什么额外的是“使用where;使用索引”而不是“使用索引”,mysql,query-optimization,Mysql,Query Optimization,为什么额外使用在哪里;使用索引而不是使用索引 CREATE TABLE `pre_count` ( `count_id` varchar(38) NOT NULL, `cam_id` varchar(38) NOT NULL, `count_time` datetime NOT NULL, PRIMARY KEY (`cam_id`
CREATE TABLE `pre_count` (
`count_id` varchar(38) NOT NULL,
`cam_id` varchar(38) NOT NULL,
`count_time` datetime NOT NULL,
PRIMARY KEY (`cam_id`,`count_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
解释从预计数中选择计数时间,其中cam_id='56849645646'
结果是:
1 SIMPLE pre_count ref PRIMARY PRIMARY 116 const 1 Using where; Using index
它只是意味着WHERE子句中的条件将用于限制查询返回的行。如果在EXPLAIN EXTRACT中没有Using where,那么查询将不会限制行 这就是手册中的含义: WHERE子句用于限制哪些行与下一个表匹配或发送到客户端。除非您特别打算从表中获取或检查所有行,否则如果额外的值未使用where,并且表联接类型为all或index,则查询中可能有错误 我可以发誓,我看到过这样的情况,即我的EXPLAIN报告中没有使用where,即使查询确实使用了索引并限制了行返回 我不得不得出结论,对于所有类型的行限制,使用where并不能可靠地报告
其他人已经注意到使用where的含义令人困惑或不一致:您使用的是哪个版本的MySQL?当我尝试MySQL 8.0.16的最新版本时,我看到没有看到使用where。我会称之为不适当的文档。使用where——正如我一直理解的那样——意味着where子句中的条件必须根据找到的行进行计算。。。也就是说,存储引擎层可能会返回太多的行,因此需要在MySQL层对它们进行进一步过滤,因此任何通过索引查找得到清晰解析的查询都不会有这样的结果。我不希望看到它出现在显示的查询中。我能想到的唯一一件事是,PK中的第二列没有包含在WHERE中,这会分散优化器的注意力。事实上,即使阅读也没有真正阐明这一点。代码逻辑似乎是,如果它是表的解释,即不是子查询,也不是“为每个记录检查的范围”,并且存在行限制条件,则报告“使用where”。但这并不包括我们知道“使用where”不会出现的情况。我发现在解释中使用where是无用的噪音。