Mysql的SQL语句分析-------explain语句

目录

 

一、为什么要使用explain语句

二、explain各个字段

2.1  id

1.2  select_type

1.3  table

1.4  type

1.5   possible_keys

1.6  key

1.7   key_len

1.8   ref

1.9  rows

1.10  filtered

1.11  extra

总结


一、为什么要使用explain语句

我们很多时候编写完一条SQL语句,往往想知道这条SQL语句执行是否高效。或者说,我们建立好的索引在这条SQL语句中是否使用到了,就可以使用explain命令来分析一下!

首先我们来体验一下explain命令是怎么使用的,以及输出的结果是什么?

explain select * from table_user ;

输出结果:

 

二、explain各个字段

explain命令输出的结果有10列:id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra 

2.1  id

包含一组数字,表示查询中执行 SELECT子句或操作表的顺序

即:

  • 如果id相同,那么执行顺序由上到下。
  • 如果id不同,那么 id 的序号会递增,id值越大优先级越高,越先被执行。(一般有子查询的SQL语句的id就不会不同)

如:

 

1.2  select_type

表示 select 查询的类型。

分别有:

  • SIMPLE:简单查询,该查询不包含 UNION 或 子查询。
  • PRIMARY:如果查询中包含 UNION 或 子查询,则最外层的查询被标识为 PRIMARY。
  • SUBQUERY:子查询中第一个select语句(该子查询不在 from 子句中)。
  • DERIVED:包含在from子句中的子查询(也称为派生表)。

select_type不止上面这些,不过上面这些是最基本的。

 

1.3  table

表示对应行正在访问哪个表(有别名就显示别名)

当from子句中有子查询时,table列是 <derivenN>格式,表示当前查询依赖 id=N的查询,于是先执行 id=N 的查询。

 

1.4  type

这列指明了Mysql决定如何查找表中符合条件的行,同时是我们判断查询是否高效的重要依据。

以下是常见的取值:

  • ALL:全表扫描,这个类型是性能最差的查询之一。通常来说,们的查询不应该出现 ALL 类型,因为这样的查询,在数据量最大的情况下,对数据库的性能是巨大的灾难。
  • index:全索引扫描,和ALL类型类似,只不过ALL是全表扫描,而index类型是扫描全部的索引,主要优点是避免了排序,但是开销仍然非常大。
  • range:范围扫描,就是一个有限制的索引扫描,它开始于索引里的某一点,返回匹配这个值域的行。这个类型通常出现在 =、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN、IN() 的操作中

  • ref:非唯一性索引扫描,一种索引访问,也称索引查找,它返回所有匹配某个单个值的行。
  • eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键唯一性索引扫描。出现于两张表的联查。

  • const、system:只返回一条记录,因为出现const一般是 用 主键或者唯一性索引匹配的时候。
  • NULL:MYSQL不访问任何表,索引,直接返回结果。

从优到差分别是:system > const > eq_ref > ref > range > index > ALL

注意:一般来说,得保证查询至少达到range级别,最好能达到ref

 

1.5   possible_keys

这一列显示查询可能使用哪些索引来查找。

1.6  key

这一列显示查询实际使用的索引,如果没有使用索引,则显示NULL。

1.7   key_len

表示查询用到的索引key的长度(字节数)。如果单列索引,那么就会把整个索引长度计算进去,如果是联合索引,不是所有的列都用到,那么就只计算实际用到的列,因此可以根据key_len来判断联合索引是否生效

1.8   ref

表示  表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。常见的有:const(常量),字段名(例:film.id)

如下:蓝色框内容为用到的索引,所以 ref = 红色框内容。

1.9  rows

MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数,原则上值越小越好。注意这个不是结果集里的行数。

1.10  filtered

指返回结果的行占需要读到的行(rows列的值)的百分比,一般来说越大越好。

1.11  extra

表示额外的信息。此字段能够给出让我们深入理解执行计划进一步的细节信息。

常见的取值如下:

  • Using index:使用覆盖索引,表示查询索引就可查到所需数据,不用扫描表数据文件,往往说明性能不错。
  • Using where:查询时没使用到索引,然后通过where条件过滤获取到所需的数据。
  • Using join buffer:使用了连接缓存。

  • Using temporary:表示在查询时,MySQL需要创建一个临时表来保存中间结果。临时表一般会比较影响性能,应该尽量避免。
  • Using filesort:对结果使用一个外部索引排序,而不是按索引次序从表里读取行,一般有出现该值,都建议优化去掉,因为这样的查询 CPU 资源消耗大。

总结

explain的信息中,一般我们要关心的是type,看是什么级别,如果是在互联网公司一般需要在range以上的级别,接着关心的是Extra,有没有出现filesort或者using temporary,一旦出现就要想办法避免,接着再看key使用的是什么索引,还有看filtered筛选比是多少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值