MySQL-EXPLAIN执行计划

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对应的是简单查询还是复杂查询,如果是复杂查询还分三种情况

  1. simple:简单查询。查询不包含子查询和union
  2. primary:复杂查询中最外层的 select
  3. subquery:包含在 select 中的子查询(不在 from 子句中)
  4. 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筛选条件是索引列之一但是不是索引的前导列,意味着无法直接通过索引查找来查询到符合条件的数据

你可能感兴趣的:(一起探究)