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是无用的噪音。