mysql extended_MYSQL EXPLAIN语句的extended 选项

mysql中有一个explain 命令可以用来分析select 语句的运行效果,例如explain可以获得select语句

使用的索引情况、排序的情况等等。除此以外,explain 的extended 扩展能够在原本explain的基础

上额外的提供一些查询优化的信息,这些信息可以通过mysql的show warnings命令得到。下面是一个最简单的例子。

首先执行对想要分析的语句进行explain,并带上extended选项

mysql> explain extended select * from account\G;

*************************** 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 warnings\G;

*************************** 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 sbtest WHERE id>5 AND id>6 AND c="a" AND pad=c

语句的输出我们得知mysql的查询优化器不能将id>5 和 id>6 这两个查询条件优化合并成一个 id>6。

在mysql performance的explain extended文章中第三个例子和静室的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 warnings\G

*************************** 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

(`test`.`t`.`a`,

(select 1 AS `Not_used` from `test`.`i`

where ((`test`.`t`.`a`) = `test`.`i`.`b`)))

1 row in set (0.00 sec)

在这里MySQL改写了SQL,做了in的优化。

/******************************以上代码和分析摘抄至静室的explain的extended选项*********************/

不过需要注意的一点是从EXPLAIN extended +show warnings得到“优化以后”的查询语句

可能还不是最终优化执行的sql,或者说explain extended看到的信息还不足以说明mysql最

终对查询语句优化的结果。同样还是mysql formance的explain Extended这篇文章的第二个

例子就说明了这种情况

/*****************************************************************************************************/

mysql> EXPLAIN extended SELECT t1.id,t2.pad FROM sbtest t1, sbtest 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`.`sbtest` `t1`

JOIN `test`.`sbtest` `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选项这篇文章中的几句话"从explain extend的输出中,我们可以

看到sql的执行方式,对于分析sql还是很有帮助的"。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29510932/viewspace-1675836/,如需转载,请注明出处,否则将追究法律责任。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值