记录MySQL查询语句EXPLAIN

  1. EXPLAIN 是 MySQL 数据库中的一个命令,用于查看查询语句的执行计划。通过 EXPLAIN 命令,可以了解 MySQL 在执行查询语句时的具体步骤、使用的索引、扫描的行数、额外操作等信息,从而优化查询性能。
  2. 使用:(只需要在查询语句前加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 在执行查询时使用了覆盖索引,并且查询效率较高。此时,可以通过优化查询语句、优化索引等方法进一步提高查询性能。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值