以下的文章主要讲述的是MySQL EXPLAIN语句中的extended 选项的实际应用与具体的操作步骤,我们大家都了解MySQL数据库中有一个explain 命令,其主要功能是用来分析select 语句的运行效果,例如explain可以获得select语句。
使用的索引情况、排序的情况等等。除此以外,explain 的extended 扩展能够在原本explain的基础
上额外的提供一些查询优化的信息,这些信息可以通过MySQL的show warnings命令得到。下面是一个最简单的例子。
首先执行对想要分析的语句进行MySQL explain,并带上extended选项
MySQL> explain extended select * from accountG;
1. row
id: 1 select_type: SIMPLE table: account type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 1 filtered: 100.00 Extra: 1 row in set, 1 warning (0.00 sec)
接下来再执行Show Warnings
MySQL> show warningsG;
1. row Level: Note
Code: 1003 Message: select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`name` AS `name` from `dbunit`.`account` 1 row in set (0.00 sec)
从 show warnings的输出结果中我们看到的是原本的select * 被MySQL优化成了
select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`name` AS `name`。
explain extended 除了能够告诉我们MySQL的查询优化能做什么,同时也能告诉我们MySQL的
查询优化做不了什么。MySQL performance的Extended EXPLAIN这篇文中中作者就利用explain
extended +show warnings 找到了MySQL查询优化器中不能查询优化的地方。
从 EXPLAIN extended SELECT * FROM *** test WHERE id>5 AND id>6 AND c=”a” AND pad=c
语句的输出我们得知MySQL的查询优化器不能将id>5 和 id>6 这两个查询条件优化合并成一个 id>6。
在MySQL performance的explain extended文章中第三个例子和静室的MySQL explain的extended选项文章中,
两位作者也对explain extended做了进一步的实验,从这个两篇文中中我们可以得出结论是从
explain extend的输出中,我们看到的是sql的执行方式,对于分析sql还是很有帮助的。
下面特别摘抄了静室的explain的extended选项该文中的内容
以下代码和分析摘抄至静室的explain的extended选项
MySQL>explain extended select * from t where a in (select b from i); +—-+——————–+——-+——+ | id | select_type | table | type | +—-+——————–+——-+——+ | 1 | PRIMARY | t | ALL | | 2 | DEPENDENT SUBQUERY | i | ALL | +—-+——————–+——-+——+ 2 rows in set, 1 warning (0.01 sec)
子查询看起来和外部的查询没有任何关系,为什么MySQL显示的是DEPENDENT SUBQUERY,
和外部相关的查询呢?从explain extended的结果我们就可以看出原因了。
MySQL>show warningsG
1. row
Level: Note Code: 1003 Message: select `test`.`t`.`a` AS `a`,`test`.`t`.`b` AS `b`,`test`.`t`.`c` AS `c` from `test`.`t` where <in_optimizer>(`test`.`t`.`a`, <exists>(select 1 AS `Not_used` from `test`.`i` where (<cache>(`test`.`t`.`a`) = `test`.`i`.`b`))) 1 row in set (0.00 sec)
在这里MySQL改写了SQL,做了in的优化。
以上代码和分析摘抄至静室的explain的extended选项
不过需要注意的一点是从EXPLAIN extended +show warnings得到“优化以后”的查询语句
可能还不是最终优化执行的sql,或者说MySQL explain extended看到的信息还不足以说明MySQL最
终对查询语句优化的结果。同样还是MySQL formance的explain Extended该文的第二个
例子就说明了这种情况
MySQL> EXPLAIN extended SELECT t1.id,t2.pad FROM *** test t1, *** test t2 WHERE t1.id=5 AND t2.k=t1.k; +—-+————-+——-+——-+—————+———+———+——-+——-+——-+ | id | select_type | TABLE | type | possible_keys | KEY | key_len | ref | rows | Extra | +—-+————-+——-+——-+—————+———+———+——-+——-+——-+ | 1 | SIMPLE | t1 | const | PRIMARY,k | PRIMARY | 4 | const | 1 | | | 1 | SIMPLE | t2 | ref | k | k | 4 | const | 55561 | | +—-+————-+——-+——-+—————+———+———+——-+——-+——-+ 2 rows IN SET, 1 warning (0.00 sec) MySQL> SHOW warnings G
1. row Level: Note
Code: 1003 Message: SELECT `test`.`t1`.`id` AS `id`,`test`.`t2`.`pad` AS `pad` FROM `test`.` *** test` `t1` JOIN `test`.` *** test` `t2` WHERE ((`test`.`t2`.`k` = `test`.`t1`.`k`) AND (`test`.`t1`.`id` = 5)) 1 row IN SET (0.00 sec)
从Explain的结果中我们可以得到t1表的查询使用的是”const”类型,也就是说MySQL查询的时候
会先由t1.id=5 找到t1.k 再利用t1.k的值去t2表中查询数据,很显然这样的查询优化结果没有在
接下来的Show Warings输出中找到。
总结
还是引用静室 在explain的 extended选项该文中的几句话”从MySQL explain extend的输出中,我们可以
看到sql的执行方式,对于分析sql还是很有帮助的”。
扫描二维码推送至手机访问。
版权声明:本文由2345好导航站长资讯发布,如需转载请注明出处。
很多使用Windows 7系统的朋友都想小编反应,假如暂停使用电脑,鼠标会出现停顿现象,这是怎么回事呢 该怎么解决呢 下面就和小编一起去看下Windows 7 usb鼠标停顿的解决方法吧。 由于Windows 7系统中有一项USB选择性暂停造成的。这项设置主要为了节电,当他检测到用户没有对系统进行...
打开IE浏览器的时候、聊QQ的时候、玩游戏的时候… … 这到底是谁惹的祸呢? 很多人都知道Windows 7桌面特效全部开启会使系统性能降低,那到底是哪个特效导致的这一情况呢? 解决办法: 右键计算机,高级系统设置-性能-设置-关闭”任务栏和开始菜单使用动画“和”最大化和最小化动态显示窗口“...
我一个朋友最近装装了Windows 7,他总感觉有人用了他的电脑,但是一直不确定,他想知道有没有人动用他的电脑,问我有没有办法 我说设置一下就行了: 启动Windows 7,在搜索栏中输入编辑组,马上就搜索到了编辑组策略,点击即可启动程序编辑组策略。依次展开组策略左侧树形列表的计算机配置/管理模...
当我在虚拟机的linux系统中ping本机的ip发现ping不通,而本机可以ping通虚拟机中的ip。应该是出于安全考虑吧,Windows 7默认在防火墙里禁止了。 1、查看主机ip 打开“开始”程序中的“附件”,找到“命令提示符”打开。输入命令:ipconfig,可以看到本机的ip是192.1...
问题现象,具体如下所示: 故障分析: 一般来说,出现这种情况是因为电脑误删系统文件或者是系统文件被顽固木马破坏。 解决方法: 1、下载360安全卫士,找到里面的急救箱开始急救,然后进行修复,完成后重新启动; 2、下载瑞...
解决方法: 其实处理这些使用流氓软件,需要将相关的.exe文件删除,使它不能再运行,或者直接清除这个服务本身,使计算机重启的时候,它不会再启动。比如Hijackthis扫描,在扫描日志中,一般会把非Windows系统的服务以023的方式列出来,如下面这段: O23 - ...