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 等列综合分析执行计划。
相关推荐
小白男神1 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶1 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G1 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备1 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远1 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
kybs19911 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
2601_962218611 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
程序猿_极客1 天前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
张洛闻Eren1 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安1 天前
MySQL-触发器
数据库·mysql