MySQL-EXPLAIN执行计划
1 ) 介绍
使用EXPLAIN关键字可以模拟优化器执行sql语句,从而分析查询语句或者结构的性能瓶颈。我们在select语句之前,加入EXPLAIN关键字,在执行之后会返回执行计划的信息,而不是执行这条sql。 例子
EXPLAIN select * from film;
我们现在就得到了一个执行计划,通过分析执行计划,我们就可以对我们的sql进行优化了。
2 ) explain中的列
2.1)id列
ID列的编号是select的序列号,并且id的顺序是按照select出现的顺序增长的,序列号越大的越先被执行。
2.2)select_type列
select_type对应的是简单查询还是复杂查询,如果是复杂查询还分三种情况
- simple:简单查询。查询不包含子查询和union
- primary:复杂查询中最外层的 select
- subquery:包含在 select 中的子查询(不在 from 子句中)
- derived:包含在 from 子句中的子查询。MySQL会将结果存放在一个临时表中
2.3)table列
表示当前正在访问哪张表
2.3)type列
这一列表示关联类型与访问类型,我们对sql进行调优,大多都是分析这个type列(重要)
依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL
- system,const 是用于唯一索引的所有列与一个常数比较,表最多有一个匹配,速度很快,system是const的一个特例
- eq_ref是唯一索引的所有部分被连接使用,这个是复杂查询,涉及多张表
- ref与上面eq_ref基本类似,使用的是普通索引或者唯一索引的部分前缀
- range 范围查找
- index 扫描全表索引
- all 全表扫描,这个特别慢了就
2.4)possible_keys列
这一列显示的是可能会使用哪些索引来查找
2.5)key列
显示的是实际上使用的索引
2.6)key_len列
这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。
2.7)ref列
显示的是key列记录的索引中,表查找值所用到的列或者常数
2.8)rows列
mysql估计要读取并检查的行数
2.9)Extra列
- Using index:查询的列被索引覆盖
- Using where:查询的列未被索引覆盖,where筛选条件非索引的前导列
- Using where Using index:查询的列被索引覆盖,并且where筛选条件是索引列之一但是不是索引的前导列,意味着无法直接通过索引查找来查询到符合条件的数据