首页
学习
活动
专区
工具
TVP
发布

MYSQL的EXPLAIN到底多好用?

工欲善其事必先利其器!

作为一名程序员,免不了要和MYSQL打交道。而在这过程中,就不得不面对性能优化这一大课题。

而在性能优化中,EXPLAIN就是能够帮助我们查看SQL执行计划是否优化的一个工具。

今天,我们就基于一个案例来看看EXPLAIN的神奇作用。

一、具体案例

我们来执行一条非常简单的代码:

expain select * from t1,t2,t3 where t1.id=t2.id and t2.id=t2.id;

执行之后的结果如下:

发现出来了很多的字段,这么多字段其实也没必要每个都重点关注,上面图片用红色框框标出了5个字段,这些是需要重点关注的。下面具体来说说这5个字段的含义。

1.type

表示访问表的方式,一共有6种。

从最好到最差的结果依次如下:

system > const > eq_ref > ref > range > index > ALL

注意:一个好的SQL语句至少要达到range级别!杜绝出现all级别。

system: 表示结果集仅有一行;

const: 表示通过主键或者唯一键键查找数据时只匹配最多一行数据;

eq_ref: 该类型多出现在多表join场景,通过主键或者唯一键访问表;

对于前表b的每行记录,都只能匹配到后表a的一行记录并且查询的比较操作通常是 =,查询效率较高。

ref: 此类型通常出现在sql使用非唯一或非主键索引, 或者是使用最左前缀规则索引的查询;

range: 表示where条件使用索引范围查询,当 type 是 range 时,ref 字段为 NULL。

index: 表示全索引扫描, 扫描所有的索引记录, 而不扫描数据;

index 类型通常会出现在覆盖索引中,所要查询的数据直接在索引中就可以访问, 而不用回表扫描数据. 此时Extra 字段 会显示 Using index。

还有一种是全表扫描时通过索引顺序访问数据。此时并不会在Extra提示 using index。

ALL: 表示执行计划选择全表扫描,当执行计划出现type 为all 时,我们尽量通过修改索引的方式让查询利用索引。

2.key

此字段是 MySQL 在当前查询时所真正使用到的索引。

如果没有选择索引,值是NULL。

可以采取强制索引方式。

3.key_len

key_len表示执行计划所选择的索引长度有多少字节,通常我们可借此判断联合索引有多少列。

key_len 大小的计算规则是:

一般地,key_len 等于索引列类型字节长度,例如int类型为4 bytes,bigint为8 bytes;

如果是字符串类型,还需要同时考虑字符集因素,例如:CHAR(30) UTF8则key_len至少是90 bytes;

若该列类型定义时允许NULL,其key_len还需要再加 1 bytes;

若该列类型为变长类型,例如 VARCHAR(TEXT\BLOB不允许整列创建索引,如果创建部分索引也被视为动态列类型),其key_len还需要再加 2 bytes。

4.rows

表示的是扫描行数。

记住:该值是个预估值,所以并非是完全准确的值。

MySQL 查询优化器根据统计信息,估算 SQL 要查找到结果集需要扫描读取的数据行数。

原则上 rows 越少越好。

5.extra

该列会提示优化执行计划的额外的信息。

注意,常见的不太友好的、值得大家关注的有如下几种:

Using index。表示该sql利用覆盖索引扫描,也即从只访问索引即可获取到所需的数据,而不用回表。

Using where。表示该sql 回表获取数据了。什么是回表呢? 其实就是仅仅通过访问索引不能满足获取所需的数据,需要访问表的page 页。

如果和Using index 同时出现,说明where条件通过索引定位数据,然后回表,再过滤所需要的数据。

Using filesort。说明排序没有利用索引而发生了额外排序 ,伴随着的可能还有Using temporary。

其实还有其它一些 提示 Using MRR、Using index condition 、Using index for group-by ,这些提示是正向的,说明sql比较优化。

6.其它字段

前面讲了5个比较重要的字段,相信很多求知欲强的小伙伴也想知道其它字段是什么意思,这里也一并列出来,以供参考:

字段含义id查询语句的序号或者说是标识符select_type表示查询的类型,常见的有如下6种table其值为表名或者表的别名,表示访问哪一个表partitions匹配的分区possible_keys表示查询时,可能使用的索引filtered按表条件过滤的行百分比二、总结

本文基于一个最为简单的案例讲解了explain的执行结果,最为重要的是5个字段,其它字段了解含义即可,希望对您有用~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201231A06S8X00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券