explain 介绍

913 阅读3分钟

我们在工作中,对于 sql 的性能问题,可能会经常使用慢日志去查询,一般情况下,我们都能解决问题,不过在日常工作中,我们可能不只要查询 sql 的性能,还会去查询 sql 的执行效率以及它的类型,那么这个时候,我们就需要使用 explain 来进一步的了解了。

explain 被称为执行计划,我经常使用它来做索引效率的查询,今天详细介绍一下它都是能做什么。

explain 涉及的各列
以上图中显示的是 explain 中涉及到的一些参数。分别代表的含义是:

  • id: 查询的唯一标识

  • select_type: 查询的类型

  • table: 查询的表, 可能是数据库中的表/视图,也可能是 FROM 中的子查询

  • type: 搜索数据的方法

  • possible_keys: 可能使用的索引

  • key: 最终决定要使用的key

  • key_len: 查询索引使用的字节数。通常越少越好

  • ref: 查询的列或常量

  • rows: 需要扫描的行数,估计值。通常越少越好

  • extra: 额外的信息

因为平时用做查询索引类型和执行效率,这里重点介绍type,其他的暂时不做多的介绍。

一、id: 包含一组数字,表示查询中执行select子句或操作表的顺序

Example(id相同,执行顺序由上至下)

二、type:表示MySQL在表中找到所需行的方式,又称“访问类型”

优先级排列顺序: ALL< index< range< ref< eq_ref< const< system< NULL

一般我们所常见的类型主要是前面四种,在一般情况下,如果类型是ref,就表明这个执行效率已经很好了。

ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行

index:Full Index Scan,index与ALL区别为index类型只遍历索引树

range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行。

ref:使用非唯一索引扫描或者唯一索引的前缀扫描,返回匹配某个单独值的记录行

eq_ref:类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件

三、 possible_keys:指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用

四、key:显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL

五、select_type:查询中每个select子句的类型(简单OR复杂)

六、key_len: 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)

七、 ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

八、rows: 表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

九、Extra:包含不适合在其他列中显示但十分重要的额外信息


:文中的图片和一些字段介绍来源于网络上的文章。自己操作执行命令,不过截图效果不好,在网上找的其他人的命令结果。