您的位置:首页 > 大数据 > 人工智能

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
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文章中第三个例子和静室的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
.
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,或者说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
.
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选项这篇文章中的几句话”从MySQL explain extend的输出中,我们可以

看到sql的执行方式,对于分析sql还是很有帮助的”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql