【MySQL】使用 Optimizer Trace 观察SQL执行过程
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执行过程的更多相关文章
- mysql中SQL执行过程详解与用于预处理语句的SQL语法
mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...
- SQL监控:mysql及mssql数据库SQL执行过程监控审计
转载 Seay_法师 最近生活有很大的一个变动,所以博客也搁置了很长一段时间没写,好像写博客已经成了习惯,搁置一段时间就有那么点危机感,心里总觉得不自在.所以从今天起还是要继续拾起墨笔(键盘),继续好 ...
- SQL执行过程中的性能负载点
一.SQL执行过程 1.用户连接数据库,执行SQL语句: 2.先在内存进行内存读,找到了所需数据就直接交给用户工作空间: 3.内存读失败,也就说在内存中没找到支持SQL所需数据,就进行物理读,也就是到 ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->新增记录SQL执行过程
有时我们需要记录整个系统运行的SQL以作分析,特别是在上线前这对我们做内部测试也非常有帮助,当然记录SQL的方法有很多,也可以使用三方的组件.3.2版本我们在框架底层新增了记录框架运行的所有SQl过程 ...
- 精尽MyBatis源码分析 - MyBatis 的 SQL 执行过程(一)之 Executor
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- 精尽MyBatis源码分析 - SQL执行过程(二)之 StatementHandler
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- 精尽MyBatis源码分析 - SQL执行过程(三)之 ResultSetHandler
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- 精尽MyBatis源码分析 - SQL执行过程(四)之延迟加载
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- MySQL笔记(5)-- SQL执行流程,MySQL体系结构
MySQL的体系结构,可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程:Server层包括连接层.查询缓存.分析器.优化器.执行器等,涵盖MySQL的大多数核心服务功能,以及所有 ...
随机推荐
- java类静态域、块,非静态域、块,构造函数的初始化顺序
原文:http://ini.iteye.com/blog/2007835 面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量, 构造器里可能还有 ...
- 【Zookeeper】源码之序列化
一.前言 在完成了前面的理论学习后,现在可以从源码角度来解析Zookeeper的细节,首先笔者想从序列化入手,因为在网络通信.数据存储中都用到了序列化,下面开始分析. 二.序列化 序列化主要在zook ...
- 如何一步一步用DDD设计一个电商网站(十一)—— 最后的准备
阅读目录 前言 准备 实现 结语 一.前言 最近实在太忙,上周停更了一周.按流程一步一步走到现在,到达了整个下单流程的最后一公里——结算页的处理.从整个流程来看,这里需要用户填写的信息是最多的,那么 ...
- quagga源码分析--路由信息处理zebra-rib
对于各个协议生成的路由信息的处理属于quagga中非常重要的一个功能,如何在内核进行路由增加,更新,删除是一个复杂的过程. quagga在thread任务调度中加入了一种工作队列,work_queue ...
- Xcode8出现AQDefaultDevice (173): skipping input stream 0 0 0x0
一直不想升级Xcode,但是没办法项目进度只能升级Xcode8,果然不出所料出现了不少bug, Xcode7运行一直没有问题,但是在Xcode8上一直输出AQDefaultDevice (173): ...
- 使用Redis的Java客户端Jedis
转载自:http://aofengblog.blog.163.com/blog/static/631702120147298317919/ 前一篇文章<Redis命令指南>讲解了通过命令行 ...
- Mac OS 上 CRT 的终端设置
这种设置完全是个人习惯, 切勿效仿!!! 整个终端是 白底黑字 显示方式(奇葩中的奇葩) 1) ANSI Color & Use color scheme 同时勾选 2) Characte ...
- NOIP2016游记(非题解)
去年的比赛现在来发是不是晚了. -------------------------------- Day1-白天 出发啦, 动车购票处一群丧病的又在玩售票机 动车上看到胡神打苍蝇 苍蝇打苍蝇 在车上颓 ...
- struts2.0中struts.xml配置文件详解
先来展示一个配置文件 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration ...
- Tiny6410之重定位代码到SDRAM
在上一章中,将代码重定位到了SRAM中,但是这样的做法作用不大.正确的做法的是将代码重定位到更大的主存中,即DRAM.Tiny6410的DRAM控制寄存器最多只能支持两个同一类型的芯片.每个芯片最多可 ...