简介
MySQL的explain命令用于SQL语句的查询执行计划(QEP),这条命令的输出结果可以让我们了解MySQL优化器是怎么执行这条SQL语句,我们可以从中分析可以优化SQL语句的途径。
语法:
explain [SQL语句]
分析SQL语句的执行信息,注意为了查看信息的时候,不影响表内的数据,查询delete或者insert等影响表内数据的SQL语句的时候,需要转换为select语句代为执行
explain [表名称]
相当于show create table [表名称]命令,查看该表的结构
explain命令信息
当我们使用explain [SQL语句]命令的时候,我们会观察到下面的输出结果:
而上面的每行信息代表的是什么的内容,对我们分析SQL语句时是十分重要的,下面就讨论一下每行的信息是什么:
id: 在QEP中展示的表的连续引用;
select_type : 表示table列引用的使用方式的类型;
常见取值:
SIMPLE:一个不包含子查询和其他复杂语法的简单查询
PRIMARY:为复杂查询创建的首要表
DERIVED:该表不是一个物理表
UNION:这是union语句其中的一个SQL元素
table: explain命令输出结果中的一个单独行的唯一表示符;可能是一个表名,表的别名或者为查询产生的临时表名
type: QEP中指定的表使用的连接方式;
常见连接方式 :
const:这个表中最多只有一行匹配
system:const的特例,当表只有一个row时
ref:所有具有匹配的索引值的行都被用到
range:所有符合一个给定范围的索引值都被用到
ALL:需要进行一次全表扫描
possible_keys: 优化器为查询选定的索引
优化器可能选择了过多的索引,有些索引没有用到
key: 优化器选择使用的索引
key_len: SQL语句的连接条件的键的长度
ref: 那些用来进行索引比较的列或常量
rows: 得出结果可能要查询的行数目的MySQL优化器估计值。
Extra: 一些额外信息
取值:
Using where :查询使用了where语句来处理结果
Using temporary:使用了内部临时表(基于内存)
Using filesort :使用了order by 语句,CPU密集型的过程
Using index:只需要使用索引就可以满足查询条件
Impossible where: where语句可能是失效的
Distinct:在找到第一行匹配的行之后就会停止搜索
Uing join buffer:获取连接条件是没有使用索引,需要连接缓冲区来存储这个结果;意味着可以通过改善索引来改善性能