mysql explain extended_MySQL EXPLAIN extended[通俗易懂]

mysql explain extended_MySQL EXPLAIN extended[通俗易懂]手册上关于EXPLAIN语法的讲解:12.8.2.EXPLAINSyntaxEXPLAIN[EXTENDED]SELECTselect_optionsOr:EXPLAINtbl_nameTheEXPLAINstatementcanbeusedeitherasawaytoobtaininformationabouthowMySQLexecute…

大家好,欢迎来到IT知识分享网。

手册上关于EXPLAIN语法的讲解:

12.8.2. EXPLAIN Syntax

EXPLAIN [EXTENDED] SELECT select_options

Or:

EXPLAIN tbl_name

The EXPLAIN statement can be used either as a way to obtain information about how MySQL executes a SELECT statement or as a synonym for DESCRIBE:

When you precede a SELECT statement with the keyword EXPLAIN, MySQL displays information from the optimizer about the query execution plan. That is, MySQL explains how it would process the SELECT, including information about how tables are joined and in which order. EXPLAIN EXTENDED can be used to provide additional information.

For information on how to use EXPLAIN and EXPLAIN EXTENDED to obtain query execution plan information, see Section 7.2.1, “Optimizing Queries with EXPLAIN”.

EXPLAIN tbl_name is synonymous with DESCRIBE tbl_name or SHOW COLUMNS FROM tbl_name.

——————-

以下的文章主要讲述的是MYSQL EXPLAIN语句中的extended 选项的实际应用与具体的操作步骤,我们大家都了解MySQL数据库中有一个explain 命令,其主要功能是用来分析select语句的运行效果,例如explain可以获得select语句。

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

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

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

MySQL> explain extendedselect*fromaccount\G;

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;

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 extendedSELECT*FROMsbtestWHEREid>5ANDid>6ANDc=”a”ANDpad=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

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 WHEREt1.id=5

ANDt2.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还是很有帮助的”。

转载自: http://database.51cto.com/art/201005/201354.htm

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24219.html

(0)
上一篇 2023-08-27 19:00
下一篇 2023-08-27 22:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信