💖简介
MySQL
的EXPLAIN
命令是一个非常强大的工具,用于分析和优化SQL
查询。它可以帮助理解MySQL
是如何执行的查询语句,包括查询中使用了哪些索引、表之间的连接方式、预计需要扫描的数据行数等信息。通过这些信息,可以找出潜在的性能瓶颈,并据此对查询进行调整以提高效率。
📖基本用法
EXPLAIN [EXTENDED] SELECT ...;
SELECT ...
是想要分析的查询语句。
EXTENDED
是可选的,如果使用了它,EXPLAIN
会输出额外的信息
⭐输出字段
- id:
表示查询中的选择标识符,每个SELECT子句都会被分配一个唯一的id。
如果查询包含嵌套或联合查询,id值会递增,数值越大优先级越高,越先被执行
- select_type:
显示查询的类型,如
SIMPLE(简单查询)
,PRIMARY(最外层查询)
,SUBQUERY(子查询)
,DERIVED(被驱动的SELECT子查询)
,UNION(使用了UNION)
等。
- table:
指出正在访问哪张表,可能是一个别名或者派生表
- partitions:
对于分区表,显示匹配的分区。如果表没有分区,则为NULL。
- type:
访问类型,指示
MySQL
如何找到数据行。从最好到最差依次为:system > const > eq_ref > ref > range > index > all
。
system
:表中只有一行记录(相当于系统表)。const
:针对主键或唯一索引的等值查询,最多只返回一行数据。eq_ref
:当使用了索引的全部组成部分,并且索引是PRIMARY KEY
或UNIQUE NOT NULL
时使用。ref
:当满足索引的最左前缀规则,或者索引不是主键也不是唯一索引时发生。range
:仅检索指定范围的行,通常出现在BETWEEN、<、>、IN
等操作中。index
:全索引扫描。all
:全表扫描。
- possible_keys:
显示
MySQL
可能使用的索引列表来查找行。
-
key:
实际被使用的索引。如果为NULL
,表示没有使用索引。 -
key_len:
使用的索引长度。数值越小通常越好。
- ref:
显示与索引比较的列或常量。
- rows:
MySQL
认为执行查询时必须检查的行数。数值越小越好。
- filtered:
表示按表条件过滤后估计符合条件的结果所占百分比。
- Extra:
包含额外的信息,如
Using where
表示使用了WHERE
子句进行过滤;Using filesort
表示需要额外的排序步骤。
🌟进阶用法
EXPLAIN EXTENDED
:提供更多的优化信息,可以通过SHOW WARNINGS
查看详细的优化过程。
EXPLAIN PARTITIONS
:对于分区表,显示将访问的具体分区。
EXPLAIN ANALYZE
:不仅显示执行计划,还会实际执行查询并提供时间统计信息。
结束