explain extend
2015-12-16 17:10
411 查看
explain 的extended 扩展能够在原本explain的基础
上额外的提供一些查询优化的信息,这些信息可以通过MySQL的show warnings命令得到。下面是一个最简单的例子。
首先执行对想要分析的语句进行MySQL explain,并带上extended选项
MySQL> explain extended select * from account\G;
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;
row Level: Note
Code: 1003
Message: select
1 row in set (0.00 sec)
从 show warnings的输出结果中我们可以看到原本的select * 被MySQL优化成了
select
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文章中第三个例子和静室的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 warnings\G
row
Level: Note
Code: 1003
Message: select
from
(
(select 1 AS
where ((
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 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
JOIN
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还是很有帮助的”。
上额外的提供一些查询优化的信息,这些信息可以通过MySQL的show warnings命令得到。下面是一个最简单的例子。
首先执行对想要分析的语句进行MySQL explain,并带上extended选项
MySQL> explain extended select * from account\G;
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;
row Level: Note
Code: 1003
Message: select
dbunit.
account.
idAS
id,
dbunit.
account.
nameAS
namefrom
dbunit.
account
1 row in set (0.00 sec)
从 show warnings的输出结果中我们可以看到原本的select * 被MySQL优化成了
select
dbunit.
account.
idAS
id,
dbunit.
account.
nameAS
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文章中第三个例子和静室的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 warnings\G
row
Level: Note
Code: 1003
Message: select
test.
t.
aAS
a,
test.
t.
bAS
b,
test.
t.
cAS
c
from
test.
twhere
(
test.
t.
a,
(select 1 AS
Not_usedfrom
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,或者说MySQL 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.
idAS
id,
test.
t2.
padAS
padFROM
test.
sbtest
t1
JOIN
test.
sbtest
t2WHERE ((
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还是很有帮助的”。
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜
- MySQL 备份与恢复