@Catyee
2021-04-20T10:07:27.000000Z
字数 3003
阅读 475
mysql
explain即解释sql语句执行计划,使用explain关键字可以模拟优化器执行查询语句,从而知道MySQL是如何处理sql语句的。explain主要用于分析查询语句或表结构的性能瓶颈。
可以阅读官方原文:
Mysql8 Explain output format官方释义
mysql> explain select * from par_table\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: par_table
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 100337
filtered: 100.00
Extra: NULL
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这些信息。
select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序,如果id相同,认为是同一组,执行顺序从上到下。如果id不同,id越大优先级越高,越先被执行
查询的类型,主要用于区别普通查询、联合查询、子查询等复杂的查询。其值主要有六个:
显示sql操作是在哪张表上进行的。
显示sql操作是在表上的哪个分区上进行的,值为NULL表示表未被分区
表示查询所使用的访问类型,type的值主要有八种,该值表示查询语句的性能好坏,从最好到最差依次为:system > const > eq_ref > ref > range > index > ALL。
SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2;
SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;
显示可能应用在表中的索引,可能一个或多个。查询涉及到的字段若存在索引,则该索引将被列出,但不一定被查询实际使用。
实际中使用的索引,如为NULL,则表示未使用索引。若查询中使用了覆盖索引,则该索引和查询的select字段重叠。
表示索引中所使用的字节数,可通过该列计算查询中使用的索引长度。在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,并不是通过表内检索出的。
显示关联的字段。如果使用常数等值查询,则显示const,如果是连接查询,则会显示关联的字段。
根据表统计信息及索引选用情况大致估算出找到所需记录所要读取的行数。当然该值越小越好。rows估算时会忽略limit,见:https://www.percona.com/blog/2006/11/12/when-explain-can-be-misleading/
mysql> explain select * from par_table_pk limit 1\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: par_table_pk
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 100130
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.01 sec)
如上,表中有10万行数据,explain估计会扫描10万多行数据,但实际上只需要1行数据就返回了。
百分比值,表示存储引擎返回的数据经过滤后,剩下多少满足查询条件记录数量的比例。
显示十分重要的额外信息。其取值常见有以下几个:
上述列举值并不完整,只是一些常用值,最好是翻阅官方文档。