MySQL在IN查询中是否识别重复值?附EXPLAIN字段疑问
MySQL IN子句重复值处理与EXPLAIN filtered字段解析
一、IN子句重复值的检查逻辑
MySQL的查询优化器会自动去重IN列表里的重复值,不会对同一条记录重复检查同一个值。比如你写的WHERE name IN ('Michael', 'Michael', 'Dan'),优化器会把它简化成WHERE name IN ('Michael', 'Dan')。所以首行name为'John'的记录,只会被检查一次是否匹配'Michael',再检查一次是否匹配'Dan',不会重复执行两次'Michael'的匹配判断。
二、EXPLAIN中filtered字段的变化现象解析
首先明确:filtered字段是MySQL优化器估算的,经过WHERE条件过滤后,剩余记录占扫描记录总数的百分比(范围0-100),它不是实际执行后的精确值,而是基于表统计信息的推测。
你遇到的“每添加一个'Michael',filtered值就乘以10,直到6个后保持50”的现象,原因在于优化器对IN列表的估算逻辑:
- 当IN列表里的重复值较少时,优化器没有立刻触发去重逻辑,而是把每个列表元素当成独立的匹配条件来计算过滤率。假设你的表统计信息显示,单个name值的匹配概率约为10%,每多一个重复的'Michael',优化器就错误地放大了过滤概率,导致filtered值成倍增长。
- 当重复的'Michael'数量达到6个时,优化器终于识别出列表里的重复值,将IN列表简化为唯一的两个值('Michael'和'Dan'),此时估算的过滤率就回归到真实的50%(也就是符合
name='Michael' OR name='Dan'的记录占总记录数的50%),之后再添加重复值也不会改变这个估算结果了。
内容的提问来源于stack exchange,提问作者user25190310
相关产品推荐
相关产品推荐

