0%

MySQL调优-explain

explain能做什么

  • 表的读取顺序

  • 数据读取操作的操作类型

  • 哪些索引可以使用

  • 哪些索引被实际使用

  • 表之间的引用

  • 每张表有多少行被优化器查询

基本语法

1
explain select select_options

explain语句输出的各列作用如下

列名 描述
id 在一个大的查询语句中每个select关键字都对应一个唯一id
select_type select关键字对应的那个查询类型
table 表名
partitions 匹配到的分区信息
type 针对单表的访问方法
possible_keys 可能用到的索引
key 实际上使用的索引
key_len 实际上使用到的索引长度
ref 当使用索引列等值查询时,与索引列进行等值匹配的对象信息
rows 预估的需要读取的记录条数
filtered 某个表经过搜索条件过滤后剩余记录条数的百分比
Extra 一些额外的信息

select_type

type

重要指标

The type column of EXPLAIN output describes how tables are joined。

小结:

结果值从最好到最坏依次是: system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

SQL性能优化的目标:至少要达到range级别,要求是ref级别,最好是const级别(阿里巴巴开发手册要求)

system

  • 当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的,比如MyISAM、Memory,那么对该表的访问方法就是system

const

  • 当我们根据主键或者唯一二级索引列与常数进行等值匹配时,对单表的访问方法就是const

ref

  • 当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是ref

eq_ref

  • 在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的(如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则 对该被驱动表的访问方法就是eq_ref

ref_or_null

  • 当对普通二级索引进行等值匹配查询,该索引列的值也可以是NULL值时,那么对该表的访问方法就可能是ref_or_null

index_merge

  • 单表访问方法时在某些场景下可以使用IntersectionUnion、Sort-Union`这三种索引合并的方式来执行查询

unique_subquery

  • unique_subquery是针对在一些包含IN子查询的查询语句中,如果查询优化器决定将IN子查询转换为EXISTS子查询,而且子查询可以使用到主键进行等值匹配的话,那么该子查询执行计划的type列的值就是unique_subquery

range

  • 如果使用索引获取某些范围区间的记录,那么就可能使用到range访问方法

index

  • 当我们可以使用索引覆盖,但需要扫描全部的索引记录时,该表的访问方法就是index

ALL

  • 最熟悉的全表扫描

possible_keys和key

可能用到的索引 和 实际上使用的索引

key_len

帮你检查是否充分的利用上了索引值越大越好,主要针对于联合索引,有一定的参考意义。

ref

  • 当使用索引列等值查询时,与索引列进行等值匹配的对象信息。
  • 比如只是一个常数或者是某个列。

rows

预估的需要读取的记录条数,值越小越好

filtered

某个表经过搜索条件过滤后剩余记录条数的百分比

Extra

额外信息

官网

https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

MySQL :: MySQL 8.0 Reference Manual :: 10.8.2 EXPLAIN Output Format