Optimizer Trace 是MySQL 5.6.3里新加的一个特性,可以把MySQL Optimizer的决策和执行过程输出成文本。输出使用JSON格式,便于程序分析和人类阅读。

使用方法

1) 启用Optimizer Trace,它默认是关闭的。

SET optimizer_trace="enabled=on";

2) 设置Trace使用的内存,默认内存比较小,有时候不够用

;

3) 执行SQL语句

 CREATE TABLE `t` (
  `a` ) ',
  `b` ) DEFAULT NULL,
  `c` ) DEFAULT NULL,
  PRIMARY KEY (`a`)
);

select a,b,c from t order by b;

4) 查看Trace输出

select trace from information_schema.optimizer_trace\G

输出样本

输出分为3大部分,如下,分别对应到JOIN::prepare(), JOIN::optimize(), JOIN::exec()三个函数(sql_optimizer.h, sql_executor.cc)。

{
    trace: {
        steps: [
            {
                join_preparation: {}
            },
            {
                join_optimization: {}
            },
            {
                join_execution: {}
            }
        ]
    }
}

详细的输出内容如下:

trace: {
  "steps": [
    {
      "join_preparation": { << JOIN::prepare(), 对参数进行展开,得到最终的标准SQL语句。
        "select#": 1,
        "steps": [
          {
            "expanded_query": "/* select#1 */ select `t`.`a` AS `a`,`t`.`b` AS `b`,`t`.`c` AS `c` from `t` order by `t`.`b`"
          }
        ]
      }
    },
    {
      "join_optimization": { << JOIN::optimize(), 优化查询过程,挑选最终执行计划
        "select#": 1,
        "steps": [
          {
            "table_dependencies": [
              {
                "table": "`t`",
                "row_may_be_null": false,
                "map_bit": 0,
                "depends_on_map_bits": [
                ]
              }
            ]
          },
          {
            "rows_estimation": [
              {
                "table": "`t`",
                "table_scan": {
                  "rows": 3,
                  "cost": 1
                }
              }
            ]
          },
          {
            "considered_execution_plans": [ << 备选执行计划
              {
                "plan_prefix": [
                ],
                "table": "`t`",
                "best_access_path": {
                  "considered_access_paths": [
                    {
                      "access_type": "scan", << 没有索引,使用全表扫描
                      "rows": 3,
                      "cost": 1.6,
                      "chosen": true,
                      "use_tmp_table": true
                    }
                  ]
                },
                "cost_for_plan": 1.6,
                "rows_for_plan": 3,
                "sort_cost": 3,
                "new_cost_for_plan": 4.6,
                "chosen": true << 本执行计划被选中
              }
            ]
          },
          {
            "attaching_conditions_to_tables": {
              "original_condition": null,
              "attached_conditions_computation": [
              ],
              "attached_conditions_summary": [
                {
                  "table": "`t`",
                  "attached": null
                }
              ]
            }
          },
          {
            "clause_processing": {
              "clause": "ORDER BY",
              "original_clause": "`t`.`b`",
              "items": [
                {
                  "item": "`t`.`b`"
                }
              ],
              "resulting_clause_is_simple": true,
              "resulting_clause": "`t`.`b`"
            }
          },
          {
            "refine_plan": [
              {
                "table": "`t`",
                "access_type": "table_scan"
              }
            ]
          }
        ]
      }
    },
    {
      "join_execution": { << JOIN::exec(), 执行过程
        "select#": 1,
        "steps": [
          {
            "filesort_information": [ << 使用了排序
              {
                "direction": "asc",
                "table": "`t`",
                "field": "b"
              }
            ],
            "filesort_priority_queue_optimization": { << 优先队列优化结果
              "usable": false,
              "cause": "not applicable (no LIMIT)"
            },
            "filesort_execution": [
            ],
            "filesort_summary": {
              "rows": 3,                                   << 结果有3行
              "examined_rows": 3,                          << 读取了3行
              "number_of_tmp_files": 0,                    << 没有使用外部排序,无分片
              "sort_buffer_size": 252896,                  << 使用的sort_buffer内存大小
              "sort_mode": "<sort_key, additional_fields>" << 排序模式,就地排序(sort_key+查询字段)
            }
          }
        ]
      }
    }
  ]
}

系统参数

追踪行为完全由OPTIMIZER_TRACE系列参数控制,关于这些参数的详细说明参考mysql的在线文档。

> show variables like '%optimizer_trace%';

+------------------------------+----------------------------------------------------------------------------+
| Variable_name                | Value                                                                      |
+------------------------------+----------------------------------------------------------------------------+
| optimizer_trace              | enabled=off,one_line=off                                                   |
| optimizer_trace_features     | greedy_search=on,range_optimizer=on,dynamic_range=on,repeated_subselect=on |
                                                                          |
                                                                      |
                                                                         |
+------------------------------+----------------------------------------------------------------------------+

我们一般只要关心optimizer_trace/optimizer_trace_max_mem_size这两个参数。

optimizer_trace    enabled=on  启用追踪

                   enabled=off 不启用追踪
                   one_line=on TRACE输出在一行里面,便于程序处理
                   one_line=off TRACE输出在多行,便于阅读
optimizer_trace_max_mem_size 追踪时最多允许使用多少内存,内存太小可能输出不完整。

这些参数是基于SESSION的,optimizer_trace默认情况下没有开启。

参考资料

https://dev.mysql.com/doc/internals/en/optimizer-tracing.html

http://dev.mysql.com/doc/dev/mysql-server/latest/PAGE_OPT_TRACE.html

【MySQL】使用 Optimizer Trace 观察SQL执行过程的更多相关文章

  1. mysql中SQL执行过程详解与用于预处理语句的SQL语法

    mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...

  2. SQL监控:mysql及mssql数据库SQL执行过程监控审计

    转载 Seay_法师 最近生活有很大的一个变动,所以博客也搁置了很长一段时间没写,好像写博客已经成了习惯,搁置一段时间就有那么点危机感,心里总觉得不自在.所以从今天起还是要继续拾起墨笔(键盘),继续好 ...

  3. SQL执行过程中的性能负载点

    一.SQL执行过程 1.用户连接数据库,执行SQL语句: 2.先在内存进行内存读,找到了所需数据就直接交给用户工作空间: 3.内存读失败,也就说在内存中没找到支持SQL所需数据,就进行物理读,也就是到 ...

  4. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->新增记录SQL执行过程

    有时我们需要记录整个系统运行的SQL以作分析,特别是在上线前这对我们做内部测试也非常有帮助,当然记录SQL的方法有很多,也可以使用三方的组件.3.2版本我们在框架底层新增了记录框架运行的所有SQl过程 ...

  5. 精尽MyBatis源码分析 - MyBatis 的 SQL 执行过程(一)之 Executor

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  6. 精尽MyBatis源码分析 - SQL执行过程(二)之 StatementHandler

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  7. 精尽MyBatis源码分析 - SQL执行过程(三)之 ResultSetHandler

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  8. 精尽MyBatis源码分析 - SQL执行过程(四)之延迟加载

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  9. MySQL笔记(5)-- SQL执行流程,MySQL体系结构

    MySQL的体系结构,可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程:Server层包括连接层.查询缓存.分析器.优化器.执行器等,涵盖MySQL的大多数核心服务功能,以及所有 ...

随机推荐

  1. webpack入门必知必会

    关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 这是我第一篇介绍webpack的文章,先从一个入门教程开始吧,后续会有更多相关webpack的文章推 ...

  2. ASP.NET Zero--9.一个例子(2)商品分类管理-列表

    1.创建实体类 参考:http://www.cnblogs.com/farb/p/4923137.html 在Core(领域层)项目下新建一个目录Entities,在此目录下新建一个Category类 ...

  3. win7无声音显示“未插入扬声器或耳机” 怎么解决

    不知道是否有用户朋友跟本人遇到这么一个情况,电脑不论是不是有插上耳机或者扬声器,在机箱前面和后面的耳机插孔处都试了好几遍,win8纯净版系统依旧没有声音. 这时候我们来看一下桌面右下角音量图标显示一个 ...

  4. mac 切换php版本

    通过brew安装的php可以通过brew link和brew unlink来切换不同版本 #brew list #brew unlink php56 #brew link php55

  5. CodeForces 718C Sasha and Array

    线段树. 线段树维护区间矩阵和,操作都是最简单的线段树.$lazy$标记不要记录乘了几次,直接记录乘了几次之后的矩阵就可以了,不然每次下传的时候再算一遍时间复杂度会提高. #pragma commen ...

  6. 《DSP using MATLAB》示例Example6.4

    图形表达如下: 代码: b = [1, 0, 0, 0, 16+1/16, 0, 0, 0, 1]; [b0, B, A] = dir2cas(b, 1) 运行结果: 写成公式为

  7. openssh-clients(CentOS 7 自带的SSH客户端)

    OpenSSH 有自带的服务端 openssh-server(sshd服务) 和 客户端 openssh-clients(ssh命令),平时使用SSH远程登陆Linux都是在本地Windows上使用P ...

  8. lua中的面向对象编程

    简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 上述代码会输出tb1 ~= tb2.说明两个具有相同值得对象是两个不同的对象,同时在Lua中table是引用类型的 ...

  9. nginx 配置访问限制

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...

  10. 关于Objective-C Associated Objects

    一.相关函数 与Associated Objects相关的函数有三个 1 void objc_setAssociatedObject(id object, const void *key, id va ...