视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQLEXPLAIN语句中的extended选项介绍
2020-11-09 14:05:26 责编:小采
文档


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

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

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

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

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

MySQL> explain extended select * from account\G;

1. row

  1. id: 1
  2. select_type: SIMPLE
  3. table: account
  4. type: ALL
  5. possible_keys: NULL
  6. key: NULL
  7. key_len: NULL
  8. ref: NULL
  9. rows: 1
  10. filtered: 100.00
  11. Extra:
  12. 1 row in set, 1 warning (0.00 sec)

接下来再执行Show Warnings

MySQL> show warnings\G;

1. row Level: Note

  1. Code: 1003
  2. Message: select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`name` AS `name` from `dbunit`.`account`
  3. 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选项

  1. MySQL>explain extended select * from t where a in (select b from i);
  2. +—-+——————–+——-+——+
  3. | id | select_type | table | type |
  4. +—-+——————–+——-+——+
  5. | 1 | PRIMARY | t | ALL |
  6. | 2 | DEPENDENT SUBQUERY | i | ALL |
  7. +—-+——————–+——-+——+
  8. 2 rows in set, 1 warning (0.01 sec)

子查询看起来和外部的查询没有任何关系,为什么MySQL显示的是DEPENDENT SUBQUERY,

和外部相关的查询呢?从explain extended的结果我们就可以看出原因了。

MySQL>show warnings\G

1. row

  1. Level: Note
  2. Code: 1003
  3. Message: select `test`.`t`.`a` AS `a`,`test`.`t`.`b` AS `b`,`test`.`t`.`c` AS `c`
  4. from `test`.`t` where
  5. (`test`.`t`.`a`,
  6. (select 1 AS `Not_used` from `test`.`i`
  7. where ((`test`.`t`.`a`) = `test`.`i`.`b`)))
  8. 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这篇文章的第二个

例子就说明了这种情况

  1. MySQL> EXPLAIN extended SELECT t1.id,t2.pad FROM sbtest t1, sbtest t2 WHERE t1.id=5
  2. AND t2.k=t1.k;
  3. +—-+————-+——-+——-+—————+———+———+——-+——-+——-+
  4. | id | select_type | TABLE | type | possible_keys | KEY | key_len | ref | rows | Extra |
  5. +—-+————-+——-+——-+—————+———+———+——-+——-+——-+
  6. | 1 | SIMPLE | t1 | const | PRIMARY,k | PRIMARY | 4 | const | 1 | |
  7. | 1 | SIMPLE | t2 | ref | k | k | 4 | const | 55561 | |
  8. +—-+————-+——-+——-+—————+———+———+——-+——-+——-+
  9. 2 rows IN SET, 1 warning (0.00 sec)
  10. MySQL> SHOW warnings \G

1. row Level: Note

  1. Code: 1003
  2. Message: SELECT `test`.`t1`.`id` AS `id`,`test`.`t2`.`pad` AS `pad` FROM `test`.`sbtest` `t1`
  3. JOIN `test`.`sbtest` `t2` WHERE ((`test`.`t2`.`k` = `test`.`t1`.`k`) AND (`test`.`t1`.`id` = 5))
  4. 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还是很有帮助的”。

下载本文
显示全文
专题