专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 MySQL中explain命令详解

MySQL中explain命令详解

更新时间:2021-01-29 17:53:22 来源:星辉 浏览940次

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列是 <derivenN>格式,表示当前查询依赖 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命令,我们可能会觉得很复杂,无从下手,实际上我们只要掌握了上述的具体的列和列中下的属性是什么意思,学起来也就浅显易懂了。想要学习MySQL的更多知识,就到本站的MySQL教程,名师讲解,内容丰富的资料,助你学有所成!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>