MySQL中的explain命令显示了mysql如何使用索引来处理select语句以及连接表。explain显示的信息可以帮助选择更好的索引和写出更优化的查询语句。MySQL中explain命令的使用其实很简单,只要explain后边跟着SQL语句就行了。例如:explain select * from tb_student;
好奇的同学可能要问了,MySQL中的explain命令有什么特别之处吗?值得单独拿出来讲,MySQL为什么需要explain命令呢?简单来说:通过explain命令我们可以学习到该条SQL是如何执行的,随后解析explain的结果可以帮助我们使用更好的索引,最终来优化它。分点来说,mysql中explain命令有以下作用:
1.描述MySQL如何执行查询操作、执行顺序,使用到的索引,以及MySQL成功返回结果集需要执行的行数。
2.可以帮助我们分析 select 语句,让我们知道查询效率低下的原因,从而改进我们的查询,让查询优化器能够更好的工作
3.优化select 语句,分析哪些是常量表达式(例如id=1),以及分析哪些表达式可以直接转换成常量的
4.对where条件进行简化和转换,如去掉无用条件,调整条件结构等
5.读取涉及的表的统计信息,并计算分析(例如返回的行数,索引信息等),最终得出执行计划。
相对于了解explain命令的作用,能够读懂explain命令输出的结果也十分重要,explain命令的输出结果有10列:id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra,下面我们来一一介绍每列的含义。
1.id
包含一组数字,表示查询中执行SELECT子句或操作表的顺序。
在id列上也会有几种情况:
如果id相同执行顺序由上至下。
如果id不相同,id的序号会递增,id值越大优先级越高,越先被执行。
2.select_type
表示select查询的类型
select_type属性下有好几种类型:
SIMPLLE:简单查询,该查询不包含 UNION 或子查询
PRIMARY:如果查询包含UNION 或子查询,则最外层的查询被标识为PRIMARY
UNION:表示此查询是 UNION 中的第二个或者随后的查询
DEPENDENT:UNION 满足 UNION 中的第二个或者随后的查询,其次取决于外面的查询
UNION RESULT:UNION 的结果
SUBQUERY:子查询中的第一个select语句(该子查询不在from子句中)
DEPENDENT SUBQUERY:子查询中的 第一个 select,同时取决于外面的查询
DERIVED:包含在from子句中子查询(也称为派生表)
UNCACHEABLE SUBQUERY:满足是子查询中的第一个 select 语句,同时意味着 select 中的某些特性阻止结果被缓存于一个 Item_cache 中
UNCACHEABLE UNION:满足此查询是 UNION 中的第二个或者随后的查询,同时意味着 select 中的某些特性阻止结果被缓存于一个 Item_cache 中
类型有点多啊,我加粗的是最常见的,起码要看得懂加粗的部分。
3.table
该列显示了对应行正在访问哪个表(有别名就显示别名)。
当from子句中有子查询时,table列是 格式,表示当前查询依赖 id=N的查询,于是先执行 id=N 的查询
4.type
该列称为关联类型或者访问类型,它指明了MySQL决定如何查找表中符合条件的行,同时是我们判断查询是否高效的重要依据。
5.possible_keys
这一列显示查询可能使用哪些索引来查找
6.key
这一列显示MySQL实际决定使用的索引。如果没有选择索引,键是NULL。
7.key_len
这一列显示了在索引里使用的字节数,当key列的值为 NULL 时,则该列也是 NULL
8.ref
这一列显示了哪些字段或者常量被用来和key配合从表中查询记录出来。
9.rows
这一列显示了估计要找到所需的行而要读取的行数,这个值是个估计值,原则上值越小越好。
10.extra
其他的信息
常见的取值如下:
Using index:使用覆盖索引,表示查询索引就可查到所需数据,不用扫描表数据文件,往往说明性能不错。
Using Where:在存储引擎检索行后再进行过滤,使用了where从句来限制哪些行将与下一张表匹配或者是返回给用户。
Using temporary:在查询结果排序时会使用一个临时表,一般出现于排序、分组和多表 join 的情况,查询效率不高,建议优化。
Using filesort:对结果使用一个外部索引排序,而不是按索引次序从表里读取行,一般有出现该值,都建议优化去掉,因为这样的查询 CPU 资源消耗大。
初次遇见MySQL中的explain命令,我们可能会觉得很复杂,无从下手,实际上我们只要掌握了上述的具体的列和列中下的属性是什么意思,学起来也就浅显易懂了。