怎么看mysql执行计划

前言

      mysql是关系型数据库中比较流行的一款数据库。在工作中使用mysql,难免会遇到sql执行缓慢的情况。这时候,我们就需要查看sql的执行计划,以此来分析sql执行缓慢的问题所在。

如何查看mysql执行计划

方法一:使用explain(推荐)

explain select * from t_user;

方法二:使用Navicat解释执行

执行计划结果

下面,我们依次解析每个字段的含义。

id(重要)

表示表的读取顺序,分为两种情况:

  • id相同,读表顺序从上往下
  • id不同,优先读取id大的

举例1: id相同,先读取表t2(t_user_age),再读取表t1(t_user)

举例2:id不同,从大到小,所以先读取t_user_age, 再读取子查询的衍生表,最后读取t_user表。

select_type

查询类型,有如下类型:

  • simple           简单语句,不包含子查询或者union
  • primary         若语句包含复杂查询,则语句的最外层为primary
  • subquery       在select或者where中包含子查询
  • derived          在from中包含的子查询为derived(衍生表)
  • union             在union之后的查询,被标记为union类型
  • union result   从union获取结果的select查询
  • 其余类型。。。

举例1:simple类型

举例2: union,union result, primary

table

如题,表示表名

type(重要)

索引类型, 有很多种,常见的类型按照性能从差到好为:

all < index < range < ref < eq_ref < const < system

  • all                   表示全表扫描,性能最差
  • index              走索引,扫描了索引文件的全部数据
  • range             走索引,索引列使用了范围查找,如between, in, <, >
  • ref                  表示非唯一性索引
  • eq_ref            表示唯一索引
  • const              一次就找到数据的唯一索引
  • system           只有一条数据的系统表

在实际业务中,sql能使用到range, ref级别的索引就算是比较好的了。

possible_keys

mysql分析可能使用到的索引,实际不一定会用到。

key(重要)

实际使用的索引,key有值才表示真的用到了索引

key_len

使用到的索引长度,根据索引组合字段类型所占的字节数来计算。在能找到正确数据的情况下,长度越短越好。

ref

哪些列或常量被用于查找索引列上的值,即索引列=ref值。值有:

  • const       常量
  • 表的列     

rows(重要)

mysql估算的找到满足条件的记录所需要读取的行数,越少越好。

extra(重要)

mysql将执行计划的其他信息放到extra中。常见的有:

  1. Using filesort                             排序没有用到索引(重要,能使用索引排序是更好的)
  2. Using temporary                       使用了临时表保存中间结果,mysql在对查询结果排序时使用临时表,常见于order by 和group by(重要,使用临时表降低性能,最好排除掉)
  3. Using index                              表明select查询使用了覆盖索引(即只查索引文件就找到了需要的数据,不再需要访问表)
  4. Using where                             表示使用了where查询条件
  5. Using join buffer                       表示表join关联使用到了缓存
  6. impossible where                     表示where条件永远是false,拿不到数据
  7. using index condition               使用了索引条件

结论

分析执行计划,重点关注id, type, key, rows, extra信息。id查看表加载顺序,type查看索引类型,key查看使用的具体索引,rows关注查找结果所需遍历的数据量大不大,extra关注其他一些影响性能的关键信息。

欢迎关注我的公众号,不定期分享java文章,一起学习进步。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值