[关闭]
@Catyee 2021-04-20T10:07:27.000000Z 字数 3003 阅读 475

mysql explain详解

mysql


explain即解释sql语句执行计划,使用explain关键字可以模拟优化器执行查询语句,从而知道MySQL是如何处理sql语句的。explain主要用于分析查询语句或表结构的性能瓶颈。

可以阅读官方原文:
Mysql8 Explain output format官方释义

一、explain包含的信息

  1. mysql> explain select * from par_table\G
  2. *************************** 1. row ***************************
  3. id: 1
  4. select_type: SIMPLE
  5. table: par_table
  6. partitions: NULL
  7. type: ALL
  8. possible_keys: NULL
  9. key: NULL
  10. key_len: NULL
  11. ref: NULL
  12. rows: 100337
  13. filtered: 100.00
  14. Extra: NULL
  15. 1 row in set, 1 warning (0.00 sec)

如上所示,explain包含id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra这些信息。

1.1 explain查询结果含义

1.1.1 id

select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序,如果id相同,认为是同一组,执行顺序从上到下。如果id不同,id越大优先级越高,越先被执行

1.1.2 select_type

查询的类型,主要用于区别普通查询、联合查询、子查询等复杂的查询。其值主要有六个:

1.1.3 table

显示sql操作是在哪张表上进行的。

1.1.4 partitions

显示sql操作是在表上的哪个分区上进行的,值为NULL表示表未被分区

1.1.5 type

表示查询所使用的访问类型,type的值主要有八种,该值表示查询语句的性能好坏,从最好到最差依次为:system > const > eq_ref > ref > range > index > ALL。

  1. SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2;
  1. SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;

1.1.6 possible_keys

显示可能应用在表中的索引,可能一个或多个。查询涉及到的字段若存在索引,则该索引将被列出,但不一定被查询实际使用。

1.1.7 key

实际中使用的索引,如为NULL,则表示未使用索引。若查询中使用了覆盖索引,则该索引和查询的select字段重叠。

1.1.8 key_len

表示索引中所使用的字节数,可通过该列计算查询中使用的索引长度。在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,并不是通过表内检索出的。

1.1.9 ref

显示关联的字段。如果使用常数等值查询,则显示const,如果是连接查询,则会显示关联的字段。

1.1.10 rows

根据表统计信息及索引选用情况大致估算出找到所需记录所要读取的行数。当然该值越小越好。rows估算时会忽略limit,见:https://www.percona.com/blog/2006/11/12/when-explain-can-be-misleading/

  1. mysql> explain select * from par_table_pk limit 1\G
  2. *************************** 1. row ***************************
  3. id: 1
  4. select_type: SIMPLE
  5. table: par_table_pk
  6. partitions: NULL
  7. type: ALL
  8. possible_keys: NULL
  9. key: NULL
  10. key_len: NULL
  11. ref: NULL
  12. rows: 100130
  13. filtered: 100.00
  14. Extra: NULL
  15. 1 row in set, 1 warning (0.01 sec)

如上,表中有10万行数据,explain估计会扫描10万多行数据,但实际上只需要1行数据就返回了。

1.1.11 filtered

百分比值,表示存储引擎返回的数据经过滤后,剩下多少满足查询条件记录数量的比例。

1.1.12 Extra

显示十分重要的额外信息。其取值常见有以下几个:

上述列举值并不完整,只是一些常用值,最好是翻阅官方文档。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注