MySQL执行计划中filtered百分比代表什么_解析索引条件下推过滤率

秋丽吖_9510

秋丽吖_9510

2026-05-28

577人浏览

原创

filtered 表示存储引擎返回的行中最终被 server 层保留的比例,即“留下的百分比”,非过滤掉的比例;其值基于 rows 预估扫描行数计算(rows × filtered/100),反映 WHERE 条件在 server 层的过滤效率。

mysql执行计划中filtered百分比代表什么_解析索引条件下推过滤率

filtered 字段不是“过滤掉的百分比”,而是“留下的百分比”

很多人看到 filtered = 18 就以为“过滤掉了 82%”,其实反了:filtered 表示存储引擎返回的行中,**最终被 server 层保留下来、满足 WHERE 条件的比例**。它不是对全表的过滤率,而是对 rows 列所代表的“预估扫描行数”的留存率。

举个实际例子:rows = 174,filtered = 18,意味着 MySQL 预估:索引扫描先拿到 174 行,再在 server 层用剩余条件(比如没走索引的字段)逐行判断,最后只留下约 31 行(174 × 0.18 ≈ 31)。这个过程会带来额外 CPU 和行锁开销。

  • filtered = 100 是理想状态:索引已覆盖全部查询条件,server 层无需二次过滤
  • filtered 不一定差,但要查清原因——是索引缺失?还是隐式类型转换导致索引失效?
  • 该值来自统计信息估算,不是精确值,所以不能单看数字大小下结论

为什么 filtered 低 ≠ 查询一定慢,但往往暴露索引设计问题

低 filtered 常见于以下真实场景:

  • 复合索引顺序错位:比如建了 (a, b),但查询条件是 WHERE b = ? AND a = ?,b 无法走索引前缀,server 层被迫对所有 a 匹配行再过滤 b
  • WHERE 中用了函数或表达式:WHERE YEAR(create_time) = 2025 → 索引失效,rows 变成全表或全索引扫描,filtered 往往很低
  • 字符集/排序规则不一致:如关联字段一边是 utf8mb4_0900_as_cs,另一边是 utf8mb4_general_ci,导致隐式转换,索引下推失败
  • JSON 字段或生成列未建函数索引:条件写成 data->'$.status' = 'done' 却没在该路径上建虚拟列+索引

注意:filtered 低本身不直接导致 I/O 增加,但它常和 type = ALL 或 type = index 同时出现,这时才真正危险。

如何快速定位 filtered 低的根本原因

别只盯着 filtered 数字,要结合 type、key、Extra 三列交叉验证:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 如果 type 是 range 或 ref,但 filtered ,优先检查 <code>key 是否用了预期索引,以及 Extra 是否含 Using where(表示 server 层过滤)
  • 如果 Extra 出现 Using index condition,说明用了 ICP(索引条件下推),此时 filtered 应该较高;若仍低,大概率是 ICP 没生效(比如条件含 OR、子查询、不支持下推的函数)
  • 执行 SHOW INDEX FROM table_name 对比查询条件字段是否都在 key 所指索引的最左前缀中
  • 用 ANALYZE TABLE table_name 更新统计信息,排除因过期统计导致的误判

小技巧:把原 SQL 的 WHERE 条件拆成单字段逐一 EXPLAIN,能快速定位哪个条件拖垮了 filtered。

filtered 高也不等于万事大吉

filtered = 100 看着很美,但可能掩盖更严重的问题:

  • 索引太宽:比如建了 (a, b, c, d, e) 五列联合索引,只为支持 WHERE a = ? AND b = ?,虽然 filtered = 100,但索引体积大、更新开销高、缓存效率低
  • 覆盖索引误用:SELECT * + filtered = 100,看似高效,实则可能因回表被优化器自动转为全索引扫描(type = index),I/O 反而比走主键还多
  • 统计信息偏差大:某些版本 MySQL 在数据倾斜严重时(如 99% 的 status = 'pending'),filtered 会严重高估有效过滤能力,导致优化器选错执行计划

真正关键的,从来不是 filtered 这个孤立数字,而是它背后暴露出的索引与查询条件之间的匹配质量——这东西没法靠调参解决,得一行一行看 EXPLAIN 输出,再一列一列对字段和索引。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4523

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

931

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1189

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6481

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3263

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6440

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8841

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1190

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1052

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 191人学习