面试官:Mysql中的 explain 你更关注哪些字段?

794 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 8 天,点击查看活动详情

哈喽,大家好,我是二毛。

上篇文章 面试官:Mysql中的 explain 知多少? 介绍了执行 Explain 命令的出现字段的含义,但是这么多字段,你一般更关注哪些呢?

下面我就着重介绍下这些重点字段。

type

它的含义就是:

查询使用了何种类型,它在 SQL优化中是一个非常重要的指标,以下性能从好到坏依次是:system  > const > eq_ref > ref  > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

  • 1、system: 当表仅有一行记录时(系统表),数据量很少,往往不需要进行磁盘IO,速度非常快。
  • 2、const:表示查询时命中 primary key 主键或者 unique 唯一索引,或者被连接的部分是一个常量(const)值。这类扫描效率极高,返回数据量少,速度非常快。
  • 3、eq_ref:查询时命中主键primary key 或者 unique key索引, type 就是 eq_ref。
  • 4、ref:区别于eq_ref ,ref表示使用非唯一性索引,会找到很多个符合条件的行。
  • 5、ref_or_null:这种连接类型类似于 ref,区别在于 MySQL会额外搜索包含NULL值的行。
  • 6、index_merge:使用了索引合并优化方法,查询使用了两个以上的索引。
  • 7、unique_subquery:替换下面的 IN子查询,子查询返回不重复的集合。
  • 8、index_subquery :区别于unique_subquery,用于非唯一索引,可以返回重复值。
  • 9、range:使用索引选择行,仅检索给定范围内的行。简单点说就是针对一个有索引的字段,给定范围检索数据。在where语句中使用 bettween...and、<、>、<=、in 等条件查询 type 都是 range。
  • 10、index:Index 与ALL 其实都是读全表,区别在于index是遍历索引树读取,而ALL是从硬盘中读取。
  • 11、ALL:将遍历全表以找到匹配的行,性能最差。

Extra

它的含义就是:

不适合在其他列中显示的信息,Explain 中的很多额外的信息会在 Extra 字段显示。

1、Using index

Using index:我们在相应的 select 操作中使用了覆盖索引,通俗一点讲就是查询的列被索引覆盖,使用到覆盖索引查询速度会非常快,SQl优化中理想的状态。

什么又是覆盖索引?

一条 SQL只需要通过索引就可以返回,我们所需要查询的数据(一个或几个字段),而不必通过二级索引,查到主键之后再通过主键查询整行数据(select * )。

2 Using where

查询时未找到可用的索引,进而通过where条件过滤获取所需数据,但要注意的是并不是所有带where语句的查询都会显示Using where

3 Using temporary

Using temporary:表示查询后结果需要使用临时表来存储,一般在排序或者分组查询时用到。

4 Using filesort

表示无法利用索引完成的排序操作,也就是ORDER BY的字段没有索引,通常这样的SQL都是需要优化的。

Extra列的信息非常非常多,这里就不再一一列举了。

最后

这篇文章,重点介绍了下 Explain 执行计划中 type和extra 的含义,希望对大家有帮助~

我是二毛,我们下期再见~