前言
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中。常见的有:
- Using filesort 排序没有用到索引(重要,能使用索引排序是更好的)
- Using temporary 使用了临时表保存中间结果,mysql在对查询结果排序时使用临时表,常见于order by 和group by(重要,使用临时表降低性能,最好排除掉)
- Using index 表明select查询使用了覆盖索引(即只查索引文件就找到了需要的数据,不再需要访问表)
- Using where 表示使用了where查询条件
- Using join buffer 表示表join关联使用到了缓存
- impossible where 表示where条件永远是false,拿不到数据
- using index condition 使用了索引条件
结论
分析执行计划,重点关注id, type, key, rows, extra信息。id查看表加载顺序,type查看索引类型,key查看使用的具体索引,rows关注查找结果所需遍历的数据量大不大,extra关注其他一些影响性能的关键信息。
欢迎关注我的公众号,不定期分享java文章,一起学习进步。