You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:56:11