使用 EXPLAIN
分析查询语句时,MySQL 会返回一系列指标字段,帮助理解查询的执行计划。以下是 EXPLAIN
输出中的所有字段及其含义,以及可能的值:
EXPLAIN 输出字段
- id
- select_type
- table
- partitions
- type
- possible_keys
- key
- key_len
- ref
- rows
- filtered
- Extra
字段解释及可能的值
id:
- 标识查询中执行计划的步骤。越大表示越深的嵌套查询。
- 通常为整数,表示执行的顺序和层级。
select_type:
- 查询中每个 SELECT 的类型。
- 可能的值:
SIMPLE
:简单的 SELECT 查询,不包含子查询或 UNION。PRIMARY
:最外层的 SELECT。UNION
:UNION 中的第二个或后续的 SELECT 语句。DEPENDENT UNION
:UNION 中的第二个或后续的 SELECT 语句,依赖于外部查询。UNION RESULT
:用于保存 UNION 结果的 SELECT。SUBQUERY
:子查询中的第一个 SELECT。DEPENDENT SUBQUERY
:子查询中的第一个 SELECT,依赖于外部查询。DERIVED
:派生表(子查询的 FROM 子句)。MATERIALIZED
:物化子查询。
table:
- 正在访问的表名或表的别名。
partitions:
- 被访问的分区(如果有)。
type:
- 表示查询的访问类型,显示查询优化器如何选择访问表的方法。访问类型从最佳到最差依次是:
system
:表只有一行(系统表)。const
:表最多只有一行匹配(PRIMARY KEY 或 UNIQUE 索引)。eq_ref
:每次连接都是对主键或唯一索引进行访问。ref
:非唯一索引扫描。fulltext
:使用 FULLTEXT 索引。ref_or_null
:类似ref
,但可以有 NULL 值。index_merge
:结合索引进行扫描。unique_subquery
:在IN
子查询中使用唯一索引。index_subquery
:在IN
子查询中使用非唯一索引。range
:索引范围扫描。index
:全索引扫描。ALL
:全表扫描,效率最低。
possible_keys:
- 查询中可能使用的索引列表。如果为
NULL
,表示没有可用的索引。
- 查询中可能使用的索引列表。如果为
key:
- 实际使用的索引。如果为
NULL
,表示没有使用索引。
- 实际使用的索引。如果为
key_len:
- 使用的索引长度。表示索引中使用的字节数,越小越好。
ref:
- 显示索引的哪一列被使用,哪些列或常量被用来查找索引列中的值。
rows:
- 预估需要扫描的行数。数值越小,表示查询越高效。
filtered:
- 预估的行过滤百分比。值越大越好。
Extra:
- 附加信息,包含一些额外的说明。常见值包括:
Using index
:查询覆盖索引,不需要回表。Using where
:使用了 WHERE 子句进行过滤。Using temporary
:使用了临时表,可能会影响查询效率。Using filesort
:使用文件排序,可能会影响查询效率。Using index condition
:使用了索引条件下推优化。Using MRR
:使用多范围读优化。Using join buffer
:使用连接缓冲区。FirstMatch(table_name)
:第一次匹配表。Impossible WHERE
:WHERE 子句总是为 false,查询返回空结果。No tables used
:查询不使用任何表(例如SELECT 1
)。
- 附加信息,包含一些额外的说明。常见值包括:
示例解释
假设 EXPLAIN
输出如下:
+----+-------------+------------------+------------+-------+-------------------------------+------------+---------+------+-------+----------------------------------------------+
| id | select_type | table | type | key | possible_keys | key_len | ref | rows | filtered | Extra |
+----+-------------+------------------+------------+-------+-------------------------------+------------+---------+------+----------+----------------------------------------------+
| 1 | SIMPLE | m_give_gifts_log | ref | idx_optimized | idx_optimized | 8 | const,const,const,const | 1000 | 100.00 | Using index condition; Using where |
+----+-------------+------------------+------------+-------+-------------------------------+------------+---------+------+----------+----------------------------------------------+
分析结果
- id:
1
表示这个查询只有一个步骤。 - select_type:
SIMPLE
表示这是一个简单的 SELECT 查询。 - table:
m_give_gifts_log
表示查询的表是m_give_gifts_log
。 - type:
ref
表示使用了非唯一索引扫描。 - possible_keys:
idx_optimized
表示可能使用的索引是idx_optimized
。 - key:
idx_optimized
表示实际使用的索引是idx_optimized
。 - key_len:
8
表示使用了索引的长度为 8 个字节。 - ref:表示索引匹配的具体列。
- rows:
1000
表示预估扫描的行数是 1000 行。 - filtered:
100.00
表示预估的行过滤百分比是 100%,即所有扫描的行都符合条件。 - Extra:
Using index condition; Using where
表示:Using index condition
:MySQL 使用了索引条件下推,部分 WHERE 条件在索引扫描过程中评估。Using where
:MySQL 在存储引擎返回数据之后,还需要在服务器层次进行额外的过滤操作。
通过这些指标可以全面了解查询执行计划,并进一步优化查询性能。
作者:admin 创建时间:2024-07-20 18:16
最后编辑:admin 更新时间:2024-07-20 18:37
最后编辑:admin 更新时间:2024-07-20 18:37