一.怎么查看执行计划
点击解释,在点击运行,然后在结果框点击Explain1查看执行计划
二.执行计划返回内容解释
1.id
表示表的读取顺序,分为两种情况:
id相同,读表顺序从上往下
id不同,优先读取id大的
多表查询的时候,可以用来看读表的顺序,不过一般生产开发中不会多表查询。
2.select_type
查询类型,有如下类型:
simple 简单语句,不包含子查询或者union
primary 若语句包含复杂查询,则语句的最外层为primary
subquery 在select或者where中包含子查询
derived 在from中包含的子查询为derived(衍生表)
union 在union之后的查询,被标记为union类型
union result 从union获取结果的select查询
一般都是simple,因为生产环境的sql不会写那么复杂,这也是为了高并发下的性能考虑。
3.table
对应的表
4.type
索引类型, 有很多种,常见的类型按照性能从差到好为:
all < index < range < ref < eq_ref < const < system
all 表示全表扫描,性能最差
index 走索引,扫描了索引文件的全部数据
range 走索引,索引列使用了范围查找,如between, in,
ref 表示非唯一性索引
eq_ref 表示唯一索引
const 一次就找到数据的唯一索引
system 只有一条数据的系统表
5.possible_keys
mysql分析可能使用到的索引
可以看到是PRIMARY
也就是它分析应该是走了主键索引
6.key
实际使用的索引,当key有值时才表示真的用到了索引
如果是PRIMARY,也就是实际上查询确实是走了主键索引
7.key_len
使用到的索引长度,根据索引组合字段类型所占的字节数来计算。
我们的主键应该是varchar(字符串类型),占8个字节长度
8.ref
哪些列或常量被用于查找索引列上的值,即索引列=ref值。
一般情况下有常量和表的列名两种情况
此处可以看到是常量const
9.rows
mysql估算的找到满足条件的记录所需要读取的行数,越少越好。
10.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 使用了索引条件