• MYSQL EXPLAIN语句的extended 选项学习体会


    MYSQL EXPLAIN语句的extended 选项学习体会
    2009-04-30 09:08
       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 performanceExtended 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 performanceexplain 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
    <in_optimizer>(`test`.`t`.`a`,
    <exists>(select 1 AS `Not_used` from `test`.`i`
    where (<cache>(`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 formanceexplain 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还是很有帮助的"。

    相关资源

    mysql performance的 explain extended
    静室的explain extended选项
    mysql 参考手册中的EXPLAIN语法(获取SELECT相关信息)
  • 相关阅读:
    C++11:02decltype关键字
    git 源操作,分支操作
    git操作命令以及优点
    drf--序列化组件
    项目相关 --知识点
    vue框架:
    drf --解析器,异常模块,响应模块 序列化组件
    drf框架相关
    中间键 csrf跨站请求伪造 装饰器相关 auth模块
    多对多表的创建方式 forms组件 session与cookie
  • 原文地址:https://www.cnblogs.com/cy163/p/1491473.html
Copyright © 2020-2023  润新知