MySQL 执行计划中 filtered = 100 是什么意思

filtered 表示能过滤多少数据

  • 和复合索引/联合索引有关
  • 和走索引时的WHERE查询条件有关

在 MySQL 的 EXPLAIN 执行计划中,filtered 列表示存储引擎返回的数据在服务器层过滤后剩余的比例 (百分比)。它的值范围是 0%100%,具体含义如下:


filtered = 100 的含义

  1. 100% 表示没有额外的过滤
    • 存储引擎返回的所有行都完全符合查询条件,服务器层不需要额外过滤。
    • 通常出现在以下情况:
      • 查询条件中的列全部被索引覆盖(即使用了覆盖索引)。
      • 没有 WHERE 条件,或者 WHERE 条件仅通过索引就能完全匹配。
  2. typekey 的关系
    • 如果 typerefeq_refrange 等高效访问类型,且 key 使用了正确的索引,filtered 通常会接近 100%
    • 如果 typeALL(全表扫描)或 index(全索引扫描),filtered 可能较低(例如 10%),表示存储引擎返回了大量数据,但服务器层只保留了一小部分。

你的执行计划分析

在你的 EXPLAIN 结果中:

  • filtered = 100
  • type = ref(使用索引等值查找)
  • key = idx_purchaser_id_related_order_sn(实际使用的索引)

这表明:

  1. 存储引擎通过索引 idx_purchaser_id_related_order_sn 快速定位到符合条件的行。
  2. 返回的所有行(预估 rows=2完全满足查询条件,服务器层无需过滤。
  3. 这是一个高效的查询 ,因为:
    • 使用了正确的索引(ref 访问类型)。
    • 没有冗余的数据读取或过滤。

对比示例:filtered < 100 的情况

如果查询是:

复制代码

sql

复制代码
`SELECT * FROM order_info_14 WHERE purchaser_id = 123 AND order_status = 'completed';`

order_status 不在索引中,执行计划可能是:

复制代码
复制代码
`type: ref, key: idx_purchaser_id_related_order_sn, filtered: 10%`
  • filtered=10% 表示:
    • 存储引擎通过 idx_purchaser_id_related_order_sn 返回了 100 行(rows=100)。
    • 但只有 10 行(10%)满足 order_status = 'completed',其余 90 行被服务器层过滤掉。

如何利用 filtered 优化查询?

  1. 追求 filtered=100
    • 确保 WHERE 条件中的列被索引覆盖(尤其是选择性高的列)。
    • 使用覆盖索引(Extra: Using index)避免回表。
  2. 警惕低 filtered
    • 如果 filtered 很低(如 1%),说明存储引擎返回了大量无用数据,可能导致性能问题。
    • 优化方法:
      • 添加复合索引(包含 WHERE 中的所有条件列)。
      • 重写查询以减少数据扫描范围。

总结

  • filtered=100 是好事,表示查询高效,没有冗余数据读取。
  • 如果 filtered 较低,需检查索引是否充分覆盖查询条件,或考虑优化查询逻辑。
  • 结合 typekeyrows 等列综合分析执行计划。
相关推荐
0xDevNull3 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花3 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸3 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain3 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希4 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神4 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员4 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java4 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿4 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴4 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存