- EXPLAIN 是 MySQL 数据库中的一个命令,用于查看查询语句的执行计划。通过 EXPLAIN 命令,可以了解 MySQL 在执行查询语句时的具体步骤、使用的索引、扫描的行数、额外操作等信息,从而优化查询性能。
- 使用:(只需要在查询语句前加EXPLAIN)
EXPLAIN SELECT * from ifb_official_document
3.
- id:查询的唯一标识符,可以用来区分不同的查询。
- select_type:查询的类型,包括 SIMPLE、PRIMARY、SUBQUERY、UNION、UNION RESULT 等。
- table:查询的表名。
- partitions:查询的分区。
- type:查询的访问类型,包括 const、eq_ref、ref、range、index、ALL 等。
- possible_keys:可能使用的索引。
- key:实际使用的索引。
- key_len:使用的索引长度。
- ref:连接条件。
- rows:扫描的行数。
- filtered:过滤的行数。
- Extra:额外的信息,包括 Using index、Using where、Using temporary、Using filesort 等。
4.具体说明
- select_type:查询的类型
在 MySQL 中,EXPLAIN 命令的结果中有一个 select_type 字段,用于表示查询的类型。select_type 字段的值可以是以下几种:
- SIMPLE:简单的 SELECT 查询,不包含子查询或者 UNION 操作。
- PRIMARY:查询中包含了主键列,通常是通过主键索引或者唯一索引进行查询。
- SUBQUERY:查询中包含了子查询,子查询可以在 SELECT、FROM、WHERE 子句中使用。
- DERIVED:在 FROM 子句中包含了子查询,MySQL 会先执行子查询,然后再将结果作为临时表进行查询。
- UNION:查询中使用了 UNION 操作,将多个 SELECT 查询的结果合并。
- UNION RESULT:UNION 操作的结果集,MySQL 会将多个 SELECT 查询的结果合并成一个结果集。
通过 select_type 字段,可以了解查询的类型,从而进行优化。例如,可以通过避免使用子查询、优化 UNION 操作等方法来提高查询性能。
- partitions:查询的分区
在 MySQL 中,EXPLAIN 命令的结果中有一个 partitions 字段,用于表示查询的分区情况。如果查询的表使用了分区,partitions 字段会显示分区的名称或者分区的范围。
例如,如果查询的表使用了按照日期分区的方式,查询语句中包含了日期范围的条件,那么 partitions 字段会显示使用的分区范围。如果查询的表没有使用分区,partitions 字段会显示 NULL。
通过 partitions 字段,可以了解查询的分区情况,从而进行优化。例如,可以通过优化分区的设计、调整查询条件等方法来提高查询性能。
- type:查询的访问类型
在 MySQL 中,EXPLAIN 命令的结果中有一个 type 字段,用于表示查询的访问类型。type 字段的值可以是以下几种:
- system:只有一行数据,这是 const 类型的特例。
- const:使用常量进行匹配,通常是通过主键或者唯一索引进行查询,只有一行数据。
- eq_ref:使用唯一索引进行匹配,通常是在连接操作中使用。
- ref:使用非唯一索引进行匹配,返回多行数据。
- range:使用索引范围进行匹配,返回多行数据。
- index:扫描整个索引,返回多行数据。
- ALL:扫描整个表,返回多行数据。
通过 type 字段,可以了解 MySQL 在执行查询时使用的索引类型,从而进行优化。例如,可以通过优化索引、调整查询条件等方法来提高查询性能。通常来说,type 的值越优越好,例如 const、eq_ref、ref、range、index、ALL 的顺序就是从好到坏的顺序。
- key_len:使用的索引长度。
在 MySQL 中,EXPLAIN 命令的结果中有一个 key_len 字段,用于表示使用的索引长度。key_len 字段的值是一个整数,表示 MySQL 在使用索引时使用的字节数。
索引长度是指 MySQL 在使用索引时实际使用的索引列的长度,包括索引列的数据类型、长度和是否为 NULL 等。在执行查询时,MySQL 会选择使用最短的索引,以便减少索引扫描的时间和资源消耗。
通过 key_len 字段,可以了解 MySQL 在执行查询时使用的索引长度,从而进行优化。例如,可以通过优化索引、调整查询条件等方法来提高查询性能。通常来说,key_len 的值越小越好,因为使用较短的索引可以减少索引扫描的时间和资源消耗。
- ref:连接条件。
在 MySQL 中,EXPLAIN 命令的结果中有一个 ref 字段,用于表示连接条件。ref 字段的值是一个字符串,表示 MySQL 在执行查询时使用的连接条件。
连接条件是指 MySQL 在执行连接操作时使用的条件,通常是通过索引列进行匹配。如果查询语句中包含了 JOIN 操作,MySQL 会通过连接条件将两个表中的数据进行匹配,并返回匹配的结果。
通过 ref 字段,可以了解 MySQL 在执行连接操作时使用的连接条件,从而进行优化。例如,可以通过优化连接条件、优化索引等方法来提高查询性能。通常来说,ref 字段的值越少越好,因为使用较少的连接条件可以减少连接的时间和资源消耗。
- rows:扫描的行数。
在 MySQL 中,EXPLAIN 命令的结果中有一个 rows 字段,用于表示扫描的行数。rows 字段的值是一个整数,表示 MySQL 在执行查询时扫描的行数,也称为扫描行数或者估计行数。
扫描行数是指 MySQL 在执行查询时扫描的行数,通常是通过使用索引或者全表扫描进行匹配。如果查询语句中包含了 WHERE 子句、ORDER BY 子句或者 GROUP BY 子句,MySQL 会根据这些条件进行扫描,并返回匹配的结果。
通过 rows 字段,可以了解 MySQL 在执行查询时扫描的行数,从而进行优化。例如,可以通过优化查询语句、优化索引等方法来减少扫描行数,从而提高查询性能。通常来说,rows 字段的值越少越好,因为扫描较少的行数可以减少查询的时间和资源消耗。
- filtered:过滤的行数。
在 MySQL 中,EXPLAIN 命令的结果中有一个 filtered 字段,用于表示过滤的行数。filtered 字段的值是一个百分比,表示 MySQL 在执行查询时过滤掉的行数所占的比例。
过滤行数是指 MySQL 在执行查询时过滤掉的行数,通常是通过使用 WHERE 子句、HAVING 子句或者其他条件进行过滤。如果查询语句中包含了 WHERE 子句、HAVING 子句或者其他条件,MySQL 会根据这些条件进行过滤,并返回匹配的结果。
通过 filtered 字段,可以了解 MySQL 在执行查询时过滤掉的行数所占的比例,从而进行优化。例如,可以通过优化查询条件、优化索引等方法来减少过滤行数,从而提高查询性能。通常来说,filtered 字段的值越大越好,因为过滤掉较多的行数可以减少查询的时间和资源消耗。
- Extra:额外的信息
- 索引已经失效
在 Extra 字段中,如果出现了 "Using where"、"Using filesort"、"Using temporary" 等信息,那么就可能意味着索引失效了。
具体来说,如果 Extra 字段中出现了以下信息,就可能意味着索引失效:
- Using where:表示 MySQL 在执行查询时需要进行过滤操作,但是没有使用索引进行过滤,而是使用了全表扫描或者临时表进行过滤。这种情况通常是因为查询条件中没有使用索引列,或者使用了函数或者表达式进行过滤。
- Using filesort:表示 MySQL 在执行查询时需要进行排序操作,但是没有使用索引进行排序,而是使用了临时表或者文件进行排序。这种情况通常是因为 ORDER BY 子句中没有使用索引列,或者使用了函数或者表达式进行排序。
- Using temporary:表示 MySQL 在执行查询时需要使用临时表,通常是因为查询语句中包含了 GROUP BY 子句或者 DISTINCT 子句,而且 GROUP BY 或者 DISTINCT 的列不是索引列,或者使用了函数或者表达式进行分组或者去重。
- Using join buffer:表示 MySQL 在执行连接操作时使用了连接缓存,通常是因为连接条件中的列不是索引列,或者使用了函数或者表达式进行匹配。
如果 Extra 字段中出现了上述信息,就需要对查询语句进行优化,以避免索引失效,提高查询性能。
- 索引未失效
如果 Extra 字段中没有出现 "Using where"、"Using filesort"、"Using temporary"、"Using join buffer" 等信息,就说明索引没有失效。
此时,需要关注其他字段,例如 key、rows、type 等,以了解索引的使用情况和查询性能。
- key:表示 MySQL 在执行查询时使用的索引,如果 key 字段为 NULL,则表示没有使用索引。
- rows:表示 MySQL 在执行查询时扫描的行数,如果 rows 字段较小,则表示查询效率较高。
- type:表示 MySQL 在执行查询时使用的访问类型,如果 type 字段为 const、eq_ref 或者 ref,则表示查询效率较高。
如果 key 字段为索引列,rows 字段较小,type 字段为 const、eq_ref 或者 ref,就说明索引被有效地使用了,查询效率较高。此时,可以通过优化查询语句、优化索引等方法进一步提高查询性能。
- Extra最优的索引
在 Extra 字段中,如果出现了 "Using index" 的信息,就说明 MySQL 在执行查询时使用了覆盖索引,这是最优的索引使用方式之一。
覆盖索引是指查询语句中需要获取的列都包含在了索引中,这样 MySQL 在执行查询时就可以直接使用索引进行匹配,而不需要访问数据表,从而提高查询性能。
如果 Extra 字段中出现了 "Using index" 的信息,就说明 MySQL 在执行查询时使用了覆盖索引,并且查询效率较高。此时,可以通过优化查询语句、优化索引等方法进一步提高查询性能。