持续创作,加速成长!这是我参与「掘金日新计划 · 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 的含义,希望对大家有帮助~
我是二毛,我们下期再见~