本文共 2167 字,大约阅读时间需要 7 分钟。
MySQL EXPLAIN命令详解
EXPLAIN命令是一个强大的工具,用于分析和优化MySQL查询性能。通过EXPLAIN命令,可以深入了解MySQL如何执行查询,从而找到性能瓶颈并采取改进措施。
EXPLAIN命令的使用
要使用EXPLAIN命令,执行以下语句:
EXPLAIN EXTENDED sql_statement;
执行后,执行以下命令查看警告信息:
SHOW WARNINGS;
EXPLAIN输出字段解释
EXPLAIN命令输出的字段如下表所示:
列名 | 说明 |
id | 查询序号 |
select_type | 查询类型 |
table | 引用到的表名 |
partitions | 匹配的分区 |
type | 联接类型 |
possible_keys | 可能使用的索引列名 |
key | 实际使用的索引列名 |
key_len | 索引的长度(单位:字节) |
ref | 与索引列比较的字段或常数值 |
rows | 要检索的行数(估算值) |
filtered | 查询条件过滤的行数百分比(仅在EXPLAIN EXTENDED中显示) |
Extra | 额外信息,包括优化策略的使用情况 |
各字段详解
1. id字段
- 查询序号。
- id越大的SELECT语句最先执行。
- 如果是UNION查询,id为NULL。
2. select_type字段
- 查询类型,包括:
- SIMPLE:简单SELECT,不使用UNION或子查询。
- PRIMARY:最外层的SELECT。
- UNION:UNION中第二个或之后的SELECT。
- DEPENDENT UNION:UNION中的查询依赖于外部查询。
- UNION RESULT:UNION查询结果。
- SUBQUERY:子查询中的第一个SELECT。
- DEPENDENT SUBQUERY:子查询中的SELECT依赖于外部查询。
- DERIVED:衍生表(来自FROM子句的子查询)。
- MATERIALIZED:物化子查询。
- UNCACHEABLE SUBQUERY:无法缓存的子查询。
- UNCACHEABLE UNION:无法缓存的UNION子查询。
3. table字段
- 输出行所引用的表名。
- 可能包含以下值:
<unionM,N>
:引用M和N的UNION结果。 <derivedN>
:引用派生表的结果(派生表来自FROM子句的子查询)。 <subqueryN>
:引用子查询结果物化得到的表。
4. partitions字段
- 查询匹配到的分区。
- 只有在使用PARTITIONS关键字时才显示,否则为NULL。
5. type字段
- 联接类型,从最优到最差的顺序:
- system:表中只有一行数据。
- const:最多只有一行匹配,查询开始时读取。
- eq_ref:多表join时,当前表中每行只能找到一行。
- ref:当前表中可能有多行匹配。
- fulltext:使用全文索引。
- ref_or_null:与ref类型类似,但允许 NULL 值。
- index_merge:使用索引合并优化。
- unique_subquery:替代eq_ref类型的IN子查询。
- index_subquery:替代IN子查询的非唯一索引。
- range:使用索引查询特定范围的记录。
- index:通过索引树检索数据。
- ALL:全表扫描。
6. possible_keys字段
- 可能使用的索引列名。
- 如果值为NULL,表示没有合适的索引。
7. key字段
- 实际使用的索引列名。
- 可能与possible_keys不同。
8. key_len字段
- 索引的长度(单位:字节)。
- 通过key_len值可以确定使用了联合索引的哪部分。
9. ref字段
- 与索引列比较的字段或常数值。
- 如果值为func,表示使用了函数结果。
10. rows字段
- 估算要检索的行数。
- InnoDB表的估算值可能不准确。
11. filtered字段
- 查询条件过滤的行数百分比(仅在EXPLAIN EXTENDED中显示)。
- 优化策略的使用情况,包括:
- Using filesort:需要额外排序。
- Using index:只从索引树中获取数据。
- Using index for group-by:通过索引获取GROUP BY或DISTINCT数据。
- Using index condition:使用Index Condition Pushdown优化。
- Using join buffer:使用Block Nested Loop或Batched Key Access。
- Using MRR:使用Multi-Range Read优化。
- Using sort_union/intersect/union:索引合并优化的具体算法。
- Using temporary:创建临时表。
- Using where:WHERE子句限制了记录的返回。
Profiling的使用
通过Profiling可以分析查询性能:
- SHOW PROFILE:查看单条查询的详细信息。
- SHOW PROFILES:查看最近执行的所有查询。
- Profiling默认关闭,可以通过
SET profiling = 1;
打开。
总结
通过EXPLAIN命令和Profiling工具,可以深入了解MySQL查询性能问题,从而制定有效的优化策略。
转载地址:http://phffk.baihongyu.com/