Explain是一个非常有的命令,可以用来获取关于查询执行计划的信息,以及如何解释输出 。Explain命令是查看查询优化器如何决定执行查询的主要方法 。这个功能有一定的局限性,并不总是会说出真相,但是它的输出是可以获取的最好信息,值得花时间了解,可以学习到查询是如何执行的 。
调用Explain
要使用Explain,只需在查询中的select关键字之前增加Explain这个词 。MySQL会在查询上设置一个标记 。当执行查询时,这个标记会使其返回关于在执行计划中每一步的信息,而不是执行它 。
我们来简单看一下例子:可能是最简单的Explain结果
文章插图
在查询中每个表在输出中只有一行 。如果查询是两个表的联接,那么输出中将有两行 。别名表单算为一个表 。
Explain有两个主要的变种
Explain extended看起来和正常的explain行为一样,但它会告诉服务器“逆向编译”执行计划为一个select语句 。可以通过紧接其后运行showwarnings看到这个生成的语句 。这个语句直接来自执行计划,而不是原SQL语句,到这点上已经变成一个数据结构 。大部分场景下,它都是优化过的,跟原语句不相同,可以学习查询优化器到底是如何转化语句的 。
Explain partitions会显示查询将访问的分区,如果查询是基于分区表的话 。
一般认为增加explain时,MySQL语句不会执行查询,这是错误的 。如果查询在from子句中包括子查询,那么MySQL实际上是会执行子查询,将其结果放在一个临时表中,然后完成外层查询优化 。
前面简单解释了一下Explain可以做到的事情,但是Explain也有自身的一些限制:
Explain根本不会告诉你触发器,存储过程或者UFD会如何影响查询 。
它不支持存储过程,尽管可以手动抽取查询并单独地对其进行explain操作 。
它并不会告诉你MySQL在查询执行中所做的特定优化 。
它并不会显示关于查询的执行计划的所有信息 。
它并不区分具有相同名字的事物 。比如,对内存排序和临时文件都用“filesort”,对磁盘上和内存中的临时表都显示“Using temporary” 。
可能会误导 。比如,会对一个有着很小的LIMIT的查询显示全索引扫描 。
重写非select查询
MySQL Explain只能解释select查询,并不会对存储过程调用和insert,update,delete或其他语句做解释 。但是,我们可以重写这些非select语句来利用explain 。为了利用explain,我们需要将这些语句转化成一个等价的访问所有相同列的select,所有需要的列必须在select列表,关联子句,或者where子句中 。
Explain中的列
文章插图
文章插图
文章插图
0 1
id列
这一列总是包含一个编号,标示select所属的行 。数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表示这是一个结果集,不需要使用它来进行查询 。
0 2
select_type列
这一列显示了对应行是简单还是复杂select 。
常见的有:
A:simple:表示不包含union操作或者不包含子查询的简单select查询 。有连接查询时,外层的查询为simple,且只有一个
B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary 。且只有一个
C:union:union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union
D:dependent union:与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响
E:union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null
F:subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery
G:dependent subquery:与dependentunion类似,表示这个subquery的查询要受到外部表查询的影响
H:derived:from字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select
0 3
table列
这一列显示了对应行正在访问查询的表名,如果查询使用了别名,那么这里显示的是别名,如果不涉及对数据表的操作,那么这显示为null,如果显示为尖括号括起来的<derived N>就表示这个是临时表,后边的N就是执行计划中的id,表示结果来自于这个查询产生 。如果是尖括号括起来的<union M,N>,与<derived N>类似,也是一个临时表,表示这个结果来自于union查询的id为M,N的结果集 。
推荐阅读
- 如何解决网站访问慢-MySQL负载高
- MySQL, PostgreSQL CentOS常用数据库安装和python使用
- 神仙下凡历劫是真的吗 为什么说1999年神仙下凡
- 食品安全|费列罗称召回事件不波及中国市场:旗下巧克力涉嫌沙门氏菌感染
- 胡红艳之中国茶歌词
- 伦敦大桥垮下来背景 伦敦塔要倒塌了
- 超级推荐点击率突然下降 超级推荐的点击率在多少正常
- 淘宝店铺流量突然减少 淘宝流量下滑很严重怎么办
- 下游茶商组建合作社 向茶业上游要质量求效益
- 以下6种状况 不适饮茶