MySQL 的解释计划(Execution Plan)是 MySQL 优化器在执行一条 SQL 语句之前生成的,用于描述如何执行该语句的详细步骤。通过解释计划,可以了解查询的执行路径、使用的索引、扫描的行数等信息,从而优化查询性能。
使用 EXPLAIN 获取解释计划
在 MySQL 中,你可以通过在 SQL 语句前加上 EXPLAIN 关键字来获取解释计划:
EXPLAIN SELECT * FROM employees WHERE department_id = 10 ORDER BY salary DESC;
解释解释计划
假设执行上述 EXPLAIN 语句后,返回的结果如下:
+----+-------------+-----------+-------+---------------+-----------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+-------+---------------+-----------------+---------+------+------+-------------+
| 1 | SIMPLE | employees | ref | idx_department_id | idx_department_id | 4 | const| 10 | Using where; Using filesort |
+----+-------------+-----------+-------+---------------+-----------------+---------+------+------+-------------+
每一列的含义如下:
id: 查询的标识符,如果你的查询包含子查询或联合查询,MySQL 会为每个子查询分配一个唯一的 id。
select_type: 查询的类型。SIMPLE 表示这是一个简单的查询,不包含子查询或联合查询。其他类型可能包括 PRIMARY、SUBQUERY、DERIVED 等。
table: 显示这一行的数据是关于哪个表的。
type: 连接类型,是优化器决定如何查找表中行的一个关键指标。常见的类型有:
ALL: 全表扫描,性能最差。
index: 全索引扫描,性能比全表扫描稍好。
range: 使用索引选择一个范围的行,比全表扫描好。
ref: 使用非唯一索引或唯一索引的前缀扫描,返回匹配某个值的所有行。
eq_ref: 使用唯一索引查找单个行。
const, system: 表中的最多有一个匹配行,它将在查询开始时被读取。
possible_keys: 显示可能应用在这张表上的索引。查询中涉及的列上有哪些索引可能会被使用。
key: 实际使用的索引。如果没有使用索引,则为 NULL。
key_len: 使用的索引的长度。在某些情况下,不是索引的全部部分都会被使用。
ref: 显示索引的哪一列或常量被用于查找值。
rows: MySQL 认为必须检查的行数,以找到查询所需的行。这是估算的行数,并不总是完全准确。
Extra: 包含不适合在其他列中显示的额外信息。例如,Using where 表示在存储引擎检索行之后,MySQL 服务器将对这些行应用 WHERE 条件。Using filesort 表示 MySQL 需要对结果进行额外的排序,通常是因为 ORDER BY 或 GROUP BY 子句。
解释
id: 1,表示这是一个简单的查询。
select_type: SIMPLE,表示没有子查询或联合查询。
table: employees,表示查询的表是 employees。
type: ref,表示使用非唯一索引查找匹配的行。
possible_keys: idx_department_id,表示可能使用的索引是 idx_department_id。
key: idx_department_id,表示实际使用的索引是 idx_department_id。
key_len: 4,表示索引的长度是 4 字节(假设 department_id 是 INT 类型,通常为 4 字节)。
ref: const,表示这是一个常量查找,department_id 的值是固定的。
rows: 10,表示 MySQL 估计需要检查大约 10 行数据。
Extra: Using where; Using filesort,表示在检索行之后将应用 WHERE 条件,并且需要对结果进行额外的排序。