Mysql执行计划的返回结果解释
在 MySQL 中,EXPLAIN
语句用于分析 SQL 查询的执行计划,帮助开发者了解查询是如何执行的,从而进行优化。执行 EXPLAIN
后,MySQL 会返回一张表格,每一行代表查询中的一个表,列则提供了关于该表的执行信息。以下是常见的 EXPLAIN
返回结果列的解释:
常见的 EXPLAIN
输出列
-
id:
- 查询中每个选择查询的标识符。id 值越大,优先级越高,越先执行。
- 如果是子查询,子查询的 id 会比外层查询的 id 大。
-
select_type:
- 显示查询的类型,常见的有:
SIMPLE
:简单查询,不包含子查询或联合查询。PRIMARY
:最外层的查询。SUBQUERY
:子查询中的查询。DERIVED
:派生表(子查询中的 FROM 子句)。
- 显示查询的类型,常见的有:
-
table:
- 显示当前行正在访问的表。
-
partitions:
- 显示匹配的分区信息,如果表是分区表。
-
type:
- 显示访问类型,性能从好到差依次为:
system
、const
、eq_ref
、ref
、range
、index
、ALL
。 ALL
是全表扫描,性能最差。应尽量避免。
- 显示访问类型,性能从好到差依次为:
-
possible_keys:
- 显示可能用于查询的索引。
-
key:
- 实际用于查询的索引。
-
key_len:
- 使用的索引的字节长度。该值越小越好,表示查询使用了索引的更少部分。
-
ref:
- 显示索引的哪一列被使用,并与 key 一起使用来选择记录。
-
rows:
- 估计要读取的行数。该值越小越好。
-
filtered:
- 该表的行在存储引擎层过滤后的百分比。100 表示没有过滤。
-
Extra:
- 显示执行计划的额外信息,比如:
Using index
:表明查询使用了覆盖索引。Using where
:表示使用了 WHERE 子句来过滤结果。Using temporary
:使用了临时表来存储中间结果。Using filesort
:表示 MySQL 需要额外的排序操作,通常意味着查询效率较低。
- 显示执行计划的额外信息,比如:
如何使用 EXPLAIN
-
基本使用:在查询语句前加上
EXPLAIN
关键字即可,例如:EXPLAIN SELECT * FROM users WHERE id = 1;
-
分析结果:
- 优化查询以使用索引,避免全表扫描(
ALL
)。 - 检查
Extra
列,避免使用临时表和文件排序。 - 确保
filtered
和rows
的值尽量小。
- 优化查询以使用索引,避免全表扫描(
通过分析 EXPLAIN
的输出,可以识别出查询中潜在的性能瓶颈,从而进行针对性的优化,如添加适当的索引、重写查询语句等。