SQL语句调优——explain

Mysql中的explain命令可以用来查看sql语句是否使用了索引,使用的什么索引,有没有做全表扫描。可以帮助我们优化查询语句

在explain得到的结果中,需要着重关注一些item的值,例如:

  • key,确定所执行的sql语句是否正确命中了索引
  • type,该sql语句的搜索范围是否是最优的
  • Extra,会包含一些对于优化sql十分重要的信息

explain出来的信息一共10列,下面介绍一下每一列的作用:

1、id:select 识别符,就是查询的序列号

2、select_type: 

  • SIMPLE:查询不包括子查询和UNION
  • SUBQUERY:包含在select 列表中的子查询,不在from 子句中,标记为SUBQUERY。
  • DERIVED:标记包含在from 中的子查询,mysql会递归查询并将结果放到一个临时表中。服务器内部称其“派生表”
  • UNION:联合查询,在UNION 中第二个和随后的查询被标记为UNION。第一个select以部分外查询来执行,所以被显示为primary。如果UNION被from子句中的子查询包含,那么它的第一个select会被标记为derived。
  • UNION RESULT: 用来从union的匿名临时表检索结果的select被标记为UNION RESULT。
  • SUBQUERY和UNION还可以被标记为DEPENDENT何UNCACHEABLE。DEPENDENT意味着select依赖于外层查询中发现的数据。UNCACHEABLE意味着select中的某些特性阻止结果被缓存于一个Item_cache中。

3、table:所使用的表名

4、type:指的是访问类型,表示数据库引擎查找表的方式

  • all :全表扫描,指的是sql语句会吧表中所有表数据全部扫描一遍。效率最低,我们应该尽量避免
  • index:全索引扫描,表示sql语句将会把整棵二级索引树全部读取扫描一遍,二级索引树的数据量比全表数据量小,因此效率会比all高一些,一般查询语句中查询字段为索引字段,但是没有where语句,type就会是index。
  • range:部分索引扫描,当查询为区间查询,且查询字段为索引字段的时候,这时候会根据where条件进行搜索部分索引树。
  • ref:出现于where操作符为 = ,且where字段为非索引的单表查询或者联表查询。
  • eq_ref:出现于where操作符为 = ,且where字段为唯一索引的联表查询。
  • const:出现于where操作符唯 = ,且where字段为唯一索引的单表查询,此时最多只能匹配到一行。

综上,单从type字段考虑效率,const > eq_ref > ref > range > index > all.

5、possible_keys:表示查询时候可以使用的索引列,这是基于查询访问的列和使用的比较操作符来判断的。

6、key:表示SQL语句实际执行过程中使用的索引列。

有时候mysql可能会选择优化效果不是最好的索引。这时,我们可以在select语句中使用force index(indexName)来强制mysql使用指定的索引或者通过ignore index(indexName)强制mysql忽略指定的索引。

7、key_len:表示索引字段中可能最大的长度,并不是数据使用的实际字节数,key_len是根据查找表的定义计算出来的。

8、ref:表示之前的表在key列记录的索引总查找值所用的列或常量。

9、rows:表示mysql估计为了查找所需的行而进行读取的行数。

10.Extra:包含了对于优化sql十分重要的信息

  • using index:sql语句没有where查询条件,使用 覆盖索引,不需要 回表 查询既可以拿到结果。
  • using where:没有使用索引 或者 使用了索引但需要回表查询且没有使用 下推索引
  • using index && using where :sql语句有where查询条件,且使用覆盖索引,不需要回表查询即可拿到结果。
  • using index condition:使用索引查询,sql语句的where子句查询条件字段均为同一索引字段,且开启索引下推功能,需要回表查询即可拿到结果。
  • using index condition && using where:使用索引查询,sql语句的where子句查询条件字段存在非同一索引字段,并且开启了索引下推功能,需要会标查询接口也拿到结果。
  • using filesort:当语句中使用了order by时,且orderby字段不是索引,这个时候,mysql无法利用索引进行排序,只能用排序算法重新排序,会额外耗费资源。应该尽量避免。
  • using temporary:建立临时表来存储中间结果,查询完成之后又把临时表删除,会影响性能,需要尽快优化。

 

参考文章

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值