【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的大多数核心服务功能,以及所有 ...
随机推荐
- ONLY三行脚本 SQL数据恢复到指定时间点
经常看到有人误删数据,或者误操作,特别是Update和Delete的时候没有加WHERE ... 然后就喊爹喊娘了,怕是亲爹妈也无奈摇肩. 话说,如果没有犯过错误,那你还算是程序猿(媛)麽?!没了偶尔 ...
- php 写商城网站的总结吧
---恢复内容开始--- 在兄弟连培训,这半个月在做一期项目,期间学到了很多东西,可是还有好多没有学会灵活运用.今天在登录界面加入验证码的时候,form提交不过去input里面的验证码,session ...
- Netty轻量级对象池实现分析
什么是对象池技术?对象池应用在哪些地方? 对象池其实就是缓存一些对象从而避免大量创建同一个类型的对象,类似线程池的概念.对象池缓存了一些已经创建好的对象,避免需要时才创建对象,同时限制了实例的个数.池 ...
- LightOJ 1248 Dice (III)
期望,$dp$. 设$dp[i]$表示当前已经出现过$i$个数字的期望次数.在这种状态下,如果再投一次,会出现两种可能,即出现了$i+1$个数字以及还是$i$个数字. 因此 $dp[i]=dp[i]* ...
- (八)python的简单数据类型和变量
什么是数据类型? 程序的本质就是驱使计算机去处理各种状态的变化,这些状态分为很多种. 例如英雄联盟游戏,一个人物角色有名字,钱,等级,装备等特性,大家第一时间会想到这么表示 名字:德玛西亚------ ...
- python绝技 — 搜寻蓝牙设备
需要安装蓝牙模块:pybluez sudo pip install pybluez 代码 #!/usr/bin/env python #--*--coding=utf-8--*-- #P191 #su ...
- Maven之(四)Maven命令
常用命令 从某种意义上来说,软件是帮助不懂程序的人来操作计算机的,图形化界面尤其如此.在上个世纪,比尔盖茨之所以成为世界首富,微软之所以IT界的巨鳄,就是因为Windows开图形化操作之先河,并抢先占 ...
- android 沉浸式状态栏的实现
本文介绍一种简单的实现沉浸式状态栏的方法,要高于或等于api19才可以. 实现android沉浸式状态栏很简单,添加代码两步就可以搞定. 一.在activity中添加 getWindow().addF ...
- ubuntu_虚拟机和SD卡链接失败,可能的原因
这个问题很简单吧,但是自己解决却用了很长时间,说一下方法吧! 1.有的虚拟机不兼容USB3.0的接口,所以在接SD卡(读卡器)时,请将读卡器拔出,插入笔记本USB2.0的接口上(当时自己没注意到这点, ...
- js-数据转换
<script type="text/javascript"> var msg = '{"code": 0, "data": 2 ...