MySQL的explain中的参数

1、id

每个被独立执行的操作的标识,表示对象被操作的顺序;id值大,先被执行;如果相同,执行顺序从上到下。

若没有子查询和联合查询,id则都是1。Mysql会按照id从大到小的顺序执行query,在id相同的情况下,则从上到下执行。

2、select_type

查询中每个select子句的类型

(1)SIMPLE  

(2)PRIMARY/UNION

(3)DEPENDENT UNION/UNIOIN RESULT  

(4)SUBQUERY/DEPENDENT SUBQUERY

(5)DERIVED/MATERIALIZED

(6)UNCACHEABLE SUBQUERY/UNCACHEABLE UNION

3、table

名字,被操作的对象名称,通常是表名,或者表的别名,或者一个为查询产生临时表的标示符(如派生表、子查询、集合)。

4、type

代表查询执行计划中表使用的连接方式。

连接操作类型及级别:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,得保证查询至少达到range级别,最好能达到ref。

5、partitions

匹配的分区信息(对于非分区表值为NULL)。

6、possible_keys

备选的索引(列出可能被使用到的索引)

7、key

经优化器选定的索引;常用ANALYZE TABLE命令,可以使优化器正确地选择索引。如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

8、key_len

被优化器选定的索引键的长度,单位是字节。

9、ref

表示本行被操作的对象的参照对象(被参照的对象可能是一个常量用const表示,也可能是其他表的key指向的对象)。

10、rows

查询执行所扫描的元组个数(对于InnoDB,此值是估计值)。

11、filtered

按照条件表上数据被过滤的元组个数的百分比,rows×filtered/100可以求出过滤后的元组数即实际的元组数。

12、Extra

(1)using where

(2)using temporary 

(3)using filesort  

(4)using index 

(5)using join buffer

(6)impossible where

(7)select tables optimized away  

(8)distinct

<think>好的,我现在要解决用户关于MySQL EXPLAIN语句中filtered参数的问题。首先,我需要回忆一下自己对filtered的理解,然后结合提供的引用资料来验证和补充。 用户的问题是询问filtered参数的含义和作用。根据已有的知识,我知道EXPLAIN语句用于分析查询的执行计划,而filtered列显示的是返回结果的行数占存储引擎读取行数的百分比。不过,用户提供的引用中提到了一些细节,比如filtered在MySQL 5.7默认显示,以及某些情况下可能总是100%,这可能让用户感到困惑。 先看引用[2],里面提到filtered是返回结果的行占需要读到的行的百分比,这对JOIN操作很重要,因为它影响循环次数。但用户测试时发现filtered总是100%,这可能是因为查询条件在存储引擎层已经过滤了所有行,或者索引覆盖了所有条件,导致优化器认为没有额外的过滤。 引用[4]指出filtered不是万能的,应结合其他列优化,比如避免filesort,即使filtered低也没问题。这可能意味着用户需要关注其他优化点,而不仅仅是filtered的值。 引用[3]提到EXPLAIN的统计信息是估算的,并非精确值,所以filtered也是一个估算值。这可能解释了为什么有时候值不准确或者看起来不直观。 接下来需要整理这些信息,以清晰的方式解释filtered参数。要分点说明其含义、作用、如何应用以及注意事项。例如: 1. 定义:filtered表示存储引擎返回的数据中,经过服务器层过滤后剩余的比例。 2. 作用:帮助评估JOIN顺序,优化器选择较小结果集的表作为驱动表。 3. 应用场景:在分析多表JOIN时,低filtered值可能意味着需要优化索引或查询条件。 4. 注意事项:它是估算值,可能不准确;某些情况下可能显示100%,如单表查询或索引覆盖。 同时,要结合用户提供的引用,引用[2]和[4]中的观点来支持解释,并提醒用户不要过分依赖该参数,而应综合其他执行计划信息进行优化。 最后,生成相关问题,可能涉及如何优化高filtered值的情况,与其他参数的关系,以及在查询优化中的实际应用案例等。这样能帮助用户进一步探索相关主题。</think>### MySQL EXPLAIN中filtered参数详解 #### 一、filtered参数定义 - **含义**:表示存储引擎返回的数据中,经过服务器层**WHERE条件过滤**后剩余行数的百分比。例如$filtered=10\%$表示存储引擎读取100行后,最终仅保留10行[^2][^4]。 - **计算公式**:$$filtered = \frac{\text{最终返回行数}}{\text{存储引擎读取行数(rows列值)}} \times 100\%$$ #### 二、核心作用 1. **优化JOIN顺序** MySQL优化器会优先选择$filtered$值更小的表作为驱动表(即外层循环表),从而减少内层循环的数据处理量[^2][^4]。 2. **索引效率评估** 低$filtered$值可能表明当前索引过滤效果差,例如: ```sql -- 假设索引仅覆盖`age`字段 EXPLAIN SELECT * FROM users WHERE age > 30 AND salary > 50000; ``` 若`rows=1000`且$filtered=5\%$,说明虽然有1000条`age>30`的记录,但仅有50条满足`salary>50000`,此时可考虑创建联合索引`(age, salary)`[^4]。 #### 三、典型场景分析 | 场景类型 | filtered表现 | 优化建议 | |-------------------|--------------------|----------------------------------| | 单表查询 | 始终显示100% | 正常现象,因过滤在存储引擎层完成[^2] | | 覆盖索引查询 | 可能显示100% | 检查是否需要调整查询条件 | | 多条件非索引过滤 | 值通常较低(如10%) | 添加联合索引或优化查询条件 | #### 四、使用注意事项 1. **估算值特性** $filtered$基于统计信息估算,实际值可能偏差较大[^3]。 2. **优先级判断** 当出现`Using filesort`或`Using temporary`时,应优先解决排序/临时表问题而非单纯关注$filtered$。 3. **版本差异** MySQL 5.6需使用`EXPLAIN EXTENDED`才能显示该参数,5.7+版本默认包含。 #### 五、实操验证方法 ```sql EXPLAIN FORMAT=JSON SELECT * FROM orders WHERE status='shipped' AND total_amount > 1000; ``` 观察JSON输出中的`filtered`字段,可精确到小数点后两位(如`"filtered": 23.45`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值