MySQL中的explain字段
explain字段,主要在查看查询优化器中如何进行优化,对应的执行计划。
简单述说:
explain分析后的结果主要包括
查询的序列号id,也是查询操作表的顺序; select_type查询的类型,是简单查询还是联表查询,子查询等; Table就是涉及到的表名; partitions就是分区的情况; Type字段就相对重要点,表示访问表的方式,通常用来看是否使用了索引。也表明这条sql的查询性能。 possible_keys可能用到的索引列表 key是实际使用的索引 key_len:表示索引的长度 ref指示索引的的比较条件或者连接使用的键 rows表示估计需要检查的行数 filtered表示通过索引进行查询的比例 Extra显示额外信息,也可以看索引的使用情况
字段具体分析:
-
id
:标识查询中每个操作步骤的唯一标识符,可以用于确定执行的顺序。 -
select_type
:指示查询的类型,例如:-
SIMPLE
:简单查询,不包含子查询或连接操作。 -
PRIMARY
:最外层的查询。 -
SUBQUERY
:在SELECT
列表或WHERE
子句中的子查询。 -
DERIVED
:从子查询派生出的临时表。 -
UNION
:UNION
操作的第二部分或后续部分。 -
UNION RESULT
:UNION
操作的结果。 -
DEPENDENT UNION
:UNION
子查询中依赖于外部查询的部分。 -
DEPENDENT SUBQUERY
:子查询中依赖于外部查询的部分。 -
DEPENDENT UNION RESULT
:依赖于外部查询的UNION
操作的结果。 -
MATERIALIZED
:表示使用了MATERIALIZED
(材料化)技术的子查询。 -
UNCACHEABLE SUBQUERY
:表示无法缓存的子查询。
-
-
table
:表示查询操作涉及的表名。 -
partitions
:表示查询扫描的分区数(如果表进行了分区)。 -
type
:表示访问表的方式(常用来看是否使用索引),常见类型及含义如下(从最佳到最差):-
system
:只有一行数据(系统表),这是特殊情况的一种,不会出现在InnoDB,出现在MyIsam。 -
const
:通过索引一次就能找到匹配的唯一行数据(只返回一条数据),通常针对主键或唯一索引的等值查询。 -
eq_ref
:使用等值连接,对于每个索引键,只有一条匹配的行数据,通常用于多表连接中连接条件为主键或唯一索引的查询。 -
ref
:索引中最常见的,使用非唯一索引或唯一索引的前缀(最左原则)来查找匹配的行数据,返回多个匹配的行。 -
ref_or_nul
:和ref差不多,增加了null值查询,需要扫描整个索引树信息。 -
index_merge
:他会对将多个搜索结果(条件中有两个条件)合并为一个,同一回表查询数据,还可以对结果排序,从而降低查询代价。 -
range
:使用索引范围(Between,Like,In,大于小于)需要对索引树进行扫描,效率不高。 -
index
:进行全索引扫描,遍历整个索引树。 -
all
:全表扫描,需要遍历整个表进行查询。 -
unique_subquery
:少见,在Service服务层会对sql进行优化,引擎层就不会出现了,子查询的结果使用了唯一索引进行查询。 -
index_subquery
:少见,在Service服务层会对sql进行优化,引擎层就不会出现了,子查询的结果使用了索引进行查询。 -
range_checked_for_each_record
:根据上一个表的行数据进行范围搜索。
-
-
possible_keys
:表示 MySQL 可能用到的索引列表。 -
key
:表示实际使用的索引。 -
key_len
:表示索引的长度。 -
ref
:指示索引的比较条件或者是连接使用的键。 -
rows
:表示估计需要检查的行数。 -
filtered
:表示通过索引进行查询的比例。 -
Extra
:显示额外的信息,例如:-
Using index
:查询使用了覆盖索引,即只通过索引就能满足查询需求,无需回表访问实际数据行。 -
Using where
:在查询过程中使用了WHERE
子句进行条件过滤。 -
Using temporary
:在查询过程中使用了临时表。通常发生在排序、分组或多表连接时。 -
Using filesort
:进行了文件排序操作,无法通过索引直接进行排序。 -
Using join buffer
:表示使用了连接缓存来处理连接操作。 -
Distinct
:表示使用了DISTINCT
关键字去重查询结果。 -
Full scan on NULL key
:执行一个索引上的全表扫描,在索引列上的所有值都为NULL
时发生。 -
Impossible WHERE
:表示WHERE
子句的条件总是返回false
,因此不会返回任何行。 -
Select tables optimized away
:表示查询中的某些表被优化器判断为不需要访问,结果直接从索引中获取。 -
No tables used
:表示查询不涉及任何表,仅执行常数计算。 -
Using sort_union
:表示在UNION
操作的结果集上进行排序。 -
Using intersect
:表示使用了INTERSECT
操作。
-
再理解:
在 MySQL 中,EXPLAIN
是一个非常有用的语句,用于分析 SQL 查询的执行计划。
一、作用与目的
-
了解查询执行过程:
-
EXPLAIN
可以让你了解 MySQL 如何执行特定的 SQL 查询语句。它会显示查询的执行计划,包括查询使用的索引、表的连接顺序、查询的类型等信息。 -
例如,当你执行一个复杂的多表连接查询时,通过
EXPLAIN
可以看到 MySQL 是如何选择表的连接顺序,以及是否使用了合适的索引来提高查询性能。
-
-
优化查询性能:
-
通过分析
EXPLAIN
的结果,你可以找出查询性能瓶颈,并采取相应的优化措施。例如,如果发现查询没有使用索引,你可以考虑添加合适的索引来提高查询速度。 -
例如,对于一个经常执行的查询,如果
EXPLAIN
显示查询使用了全表扫描,那么你可以通过创建索引或者优化查询语句来避免全表扫描,提高查询性能。
-
二、主要字段解释
-
id
:-
表示查询中 SELECT 语句的编号。在复杂查询中,可能有多个 SELECT 语句,这个编号可以帮助你确定查询的执行顺序。
-
例如,如果有多个表连接,
id
值较小的 SELECT 语句通常会先执行。
-
-
select_type
:-
表示查询的类型,常见的类型有
SIMPLE
(简单查询,没有子查询或连接)、PRIMARY
(主查询,外层的查询)、SUBQUERY
(子查询)、DERIVED
(派生表查询)等。 -
例如,如果查询中有子查询,
select_type
会显示为SUBQUERY
;如果查询是从一个派生表中查询数据,select_type
会显示为DERIVED
。
-
-
table
:-
表示查询涉及的表名。
-
例如,如果查询涉及两个表的连接,这里会显示两个表的名称。
-
-
type
:-
表示访问表的方式,是一个非常重要的指标。常见的类型有
ALL
(全表扫描)、index
(索引全扫描)、range
(索引范围扫描)、ref
(使用非唯一索引进行等值查询)、eq_ref
(使用唯一索引进行等值查询)等。 -
例如,如果查询使用了索引范围扫描,
type
会显示为range
;如果查询使用了唯一索引进行等值查询,type
会显示为eq_ref
。一般来说,type
的值越接近eq_ref
,查询性能越好。
-
-
possible_keys
:-
表示可能使用的索引。这是 MySQL 根据查询语句分析出来的可能使用的索引,但不一定实际使用。
-
例如,如果查询中有一个字段上有索引,这里会显示这个索引的名称。
-
-
key
:-
表示实际使用的索引。如果查询没有使用索引,这里会显示为
NULL
。 -
例如,如果查询使用了一个索引进行快速查找,这里会显示这个索引的名称。
-
-
key_len
:-
表示索引字段的长度。这个值可以帮助你了解索引的使用情况,以及是否使用了最有效的索引。
-
例如,如果索引字段的长度过长,可能会导致索引占用过多的空间,影响查询性能。
-
-
ref
:-
表示索引列与常量或者其他表的列进行等值连接的引用。
-
例如,如果查询使用了一个外键索引进行连接,这里会显示外键列所引用的表和列的名称。
-
-
rows
:-
表示 MySQL 估计需要扫描的行数。这个值是一个估计值,实际执行查询时可能会有所不同。
-
例如,如果查询使用了全表扫描,
rows
的值可能会比较大;如果查询使用了索引进行快速查找,rows
的值可能会比较小。
-
-
Extra
:
-
提供额外的信息,例如使用了临时表、文件排序等。
-
例如,如果查询需要使用临时表进行排序,
Extra
会显示Using temporary
;如果查询使用了文件排序,Extra
会显示Using filesort
。这些信息可以帮助你找出查询性能瓶颈,并采取相应的优化措施。
总之,EXPLAIN
语句是 MySQL 中非常重要的一个工具,它可以帮助你了解查询的执行计划,找出查询性能瓶颈,并采取相应的优化措施。