MySQL的EXPLAIN
命令用于获取SQL查询的执行计划(Execution Plan),它揭示了MySQL服务器如何执行给定的SELECT
语句,包括如何连接表、使用索引以及MySQL优化器选择的查询路径等重要信息。这对于分析查询性能、找出潜在的瓶颈并优化SQL语句非常有用。
以下是EXPLAIN
命令的基本用法及其输出中各个字段的详细解释:
语法:
EXPLAIN [EXTENDED | FORMAT=json] SELECT ... ;
EXTENDED
:提供额外的执行计划信息,包括临时表和文件sort的操作信息。FORMAT=json
:以JSON格式输出执行计划。
EXPLAIN输出的关键列(部分列):
id
- 表示查询中执行的顺序,id越小优先级越高,相同的id表示这一组可以并行执行。
- id=1一般表示查询的第一个表。
select_type
- SIMPLE:简单的SELECT(不使用UNION或子查询等复杂结构)。
- PRIMARY:最外面的SELECT。
- UNION / UNION RESULT:UNION查询的一部分或结果集。
- SUBQUERY:在FROM子句或WHERE子句中的子查询。
- DEPENDENT SUBQUERY:依赖外部查询结果的子查询。
- DERIVED:派生表,MySQL为了执行某些查询而创建的临时表。
table
- 当前正在访问的实际表名或临时表名。
type
- 表示表的访问类型,反映了MySQL决定如何查找所需的数据:
- ALL:全表扫描。
- index:全索引扫描。
- range:索引范围扫描。
- ref:使用非唯一索引或唯一索引的前缀扫描。
- eq_ref:唯一索引扫描,对于每个索引键,表中只有一行匹配。
- const / system:对于主键或唯一索引的等值查询,且值是常量时,通常只会返回一行。
- NULL:MySQL不需要访问表或索引即可得到结果。
possible_keys
- 表示可能使用的索引列表。
key
- 实际选择使用的索引。
key_len
- 使用到的索引长度。
ref
- 显示哪个列或常量与key一起被使用。
rows
- MySQL认为需要读取的行数,基于统计信息估算。
filtered
- 表示存储引擎返回的数据在server层过滤后,预计要返回的数据行占比。
Extra
- 提供额外信息,比如是否使用了临时表、文件排序、覆盖索引、是否使用了延迟键读取等。
示例解释:
假设有一个用户表users
,并且有索引idx_age
,执行如下查询并使用EXPLAIN
分析:
EXPLAIN SELECT * FROM users WHERE age > 20;
输出结果可能类似:
+----+-------------+--------+-------+---------------+---------+---------+------+------+----------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------+-------+---------------+---------+---------+------+------+----------+----------------+
| 1 | SIMPLE | users | range | idx_age | idx_age | 4 | NULL | 1000 | 50.00 | Using where |
+----+-------------+--------+-------+---------------+---------+---------+------+------+----------+----------------+
解释:
id
为1,表示这是整个查询的第一步。select_type
为SIMPLE,这是一个简单查询。table
为users
,说明操作的是users
表。type
为range
,表示使用了索引idx_age
进行范围扫描。possible_keys
列出了可能使用到的索引,这里是idx_age
。key
显示实际使用的索引也是idx_age
。key_len
展示了索引的具体长度。rows
估计需要扫描的行数为1000行。filtered
表示MySQL预计约50%的行会满足条件。Extra
信息显示Using where
,意味着在索引检索之后还需要进一步应用WHERE条件过滤数据行。
通过这种方式,我们可以了解到MySQL如何解析和执行SQL查询,进而有针对性地优化查询语句。