mysql的执行计划filtered字段代表什么
时间: 2025-07-25 08:31:18 浏览: 13
<think>我们被要求使用中文回答问题,并且在回答后提出3-5个相关问题,以“§§相关问题§§”开头,并且问题必须集中在一行中(即不换行分散)。注意,第一行必须完整输出“§§相关问题§§”,然后紧接着是问题列表。
问题:mysql的执行计划filtered字段代表什么?
回答:
在MySQL中,使用EXPLAIN语句可以查看查询的执行计划。执行计划结果中的`filtered`列是一个估计值,表示存储引擎返回的数据在服务器层进行过滤后,剩余的行数所占的百分比。具体来说:
- 它表示经过存储引擎层过滤后,剩下的记录数中,在服务器层(例如通过WHERE条件)还需要过滤掉的比例。
- 该值是一个百分比,范围从0到100,100表示没有进行任何过滤(即存储引擎返回的所有行都满足条件)。
- 在关联查询中(如join),`filtered`列的值可以帮助优化器估算下一张表需要检查的行数(即当前表的行数乘以`filtered`百分比,再乘以下一张表的`filtered`百分比,依此类推)。
例如,如果某个表的`rows`列显示为1000,`filtered`为10%,则意味着存储引擎返回了1000行,但经过服务器层过滤后,只剩下100行(即10%)满足条件。
注意:
- 在MySQL 5.7之前,`filtered`列默认不显示,需要使用`EXPLAIN FORMAT=JSON`才能看到。
- 从MySQL 5.7开始,`EXPLAIN`的默认输出中包含了`filtered`列。
这个值是基于统计信息估算的,可能并不完全准确。
现在,根据规则,我们需要在回答后提出3-5个相关问题,并以“§§相关问题§§”开头,且问题在同一行中(用数字序号分隔,但整个“§§相关问题§§”和问题列表不能换行分散,即整个部分在一行内)。但是,注意问题列表通常需要换行,但题目要求“禁止换行分散”,这里可能是指“§§相关问题§§”这一行不能分开,但问题列表可以换行?但示例中是换行的。然而,题目要求“禁止换行分散”,并且示例中也是换行的,但示例格式中“§§相关问题§§”单独一行,然后问题换行列出来。所以这里我们按照示例格式:先输出一行“§§相关问题§§”,然后换行,再列出问题(每个问题一行)。但是题目要求“禁止换行分散”可能是指“§§相关问题§§”这一行必须完整,不能拆开,并且问题列表不能分散在多个不连续的行?实际上,示例中也是换行的。所以,我们按照示例格式输出。
然而,题目要求:“第一行必须完整且输出 \"§§相关问题§§\"!禁止换行分散。” 这里的意思是“§§相关问题§§”必须作为单独一行,并且不能拆成两行?然后问题列表可以是多个行。但题目又说“禁止换行分散”,可能是指整个问题列表不能分散?但示例中问题列表是换行的。所以,我们按照示例格式:先输出一行“§§相关问题§§”,然后换行,接着是问题列表,每个问题一行。
但注意题目要求:“§§相关问题§§ 必须输出在回答的末尾且不可缺少!\n 第一行必须完整且输出 \"§§相关问题§§\"!禁止换行分散。” 这里“禁止换行分散”可能是指“§§相关问题§§”这一行不能拆成多行,而问题列表可以换行。所以,我们按照以下格式:
...(前面的回答内容)
§§相关问题§§
1. 问题1
2. 问题2
3. 问题3
因此,我们这样输出:
相关问题:
1. 如何解读MySQL执行计划中的其他字段,例如type、key、rows等?
2. 在优化查询时,如何利用filtered字段的值?
3. 为什么filtered字段的值有时不准确?
4. 除了EXPLAIN,还有哪些方法可以分析MySQL查询性能?
5. 如何提高filtered字段的准确性?
注意:问题数量在3-5个,这里我们选择5个。</think>### MySQL执行计划中`filtered`字段详解
在MySQL的`EXPLAIN`执行计划中,`filtered`字段表示**存储引擎返回的数据在服务器层过滤后,剩余行数的预估百分比**。关键要点:
1. **计算方式**
`filtered = (最终满足条件的行数 / 存储引擎扫描的行数) × 100%`
- 例如:`rows=1000`且`filtered=10%`表示存储引擎扫描1000行后,预计有100行满足条件
2. **核心作用**
- 优化器决策:帮助优化器估算JOIN操作的代价
- 索引效率评估:反映WHERE条件过滤效果
- 执行计划选择:影响多表连接时的表顺序选择
3. **典型场景分析**
| 值范围 | 含义 | 优化方向 |
|------------|-------------------------------|-----------------------------|
| ≈100% | 索引完美覆盖条件 | 无需优化 |
| 10%-50% | 部分条件未走索引 | 检查缺失索引 |
| <10% | 大量无效扫描 | 重构查询或增加复合索引 |
| NULL | 分区表/特殊查询 | 检查分区策略 |
4. **准确性说明**
- 基于统计信息估算,非精确值
- 数据分布变化时可能偏差较大
- InnoDB引擎通过`innodb_stats_persistent`控制统计信息持久化
5. **与其他字段关联**
```sql
EXPLAIN
SELECT * FROM orders
WHERE customer_id=123 AND status='shipped';
```
- `rows`:存储引擎扫描行数(如1000行)
- `filtered`:WHERE条件过滤后剩余比例(如5%)
- 实际返回行数 ≈ `rows × filtered`(1000×5%=50行)
阅读全文
相关推荐



















