explain是MySQL中执行计划分析的利器,经常用来分析低效SQL。通过explain我们可以获取到数据的访问类型、索引的使用、分区信息等情况。这里列举以下explain分析的结果含义。
select_type
表示select的类型,常见的取值有simple(简单表,即不使用表连接或者子查询)、primary(主查询,即外层的查询)、union(union中的第二个或者后面的查询语句)、subquery(子查询中的第一个select)等
table
输出结果集的表
type
表示MySQL在表中找到所需行的方式,或者叫访问类型。常见的访问类型有以下几种:
all、index、range、ref、eq_ref、const/system、null
从左到右,性能由差到好
- all:全表扫描,MySQL遍历全表来找到匹配的行
- index:索引全扫描,MySQL遍历整个索引来查询匹配的行
- range:索引范围扫描,常见于<、<=、>、>=、between等操作符
- ref:使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录行
- eq_ref:类似ref,区别就在使用的索引是唯一索引(unique),对于每个索引值,表中只有一条记录匹配
- const/system:单表中最多有一个匹配行,查询起来非常迅速,所以这个匹配行中的其他列的值可以被优化器在当前查询中当做常量来处理
- null:MySQL不用访问表或者索引,直接就能够得到结果
possible_keys
表示查询时可能使用的索引
key
表示实际使用的索引
key_len
使用到索引的长度
rows
扫描行的数量
extra
执行情况的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息
partitions
如果进行了分区的话,返回访问的SQL分区
以上基本就是explain结果的基本字段含义了。另外MySQL还可以追加使用"show warnings\G"命令,来查看SQL真正被执行之前优化器做了哪些改写。如: