MySQL代码使用了大量Opt_trace相关结构,先看代码中的一段注释:

This optimizer trace is aimed at producing output, which is readable by

humans and by programs, to aid understanding of decisions and actions taken

by the MySQL Optimizer.

可以看出Opt_trace是用来记录相关操作的,以便帮助开发人员进行调试。其并不具有功能性作用。先来看一下MySQL中是怎么使用Opt_trace的。在主执行函数mysql_execute_command中(位于sql_parse.cc):

Opt_trace_start ots(thd, all_tables, lex->sql_command, &lex->var_list,

thd->query().str, thd->query().length, NULL,

thd->variables.character_set_client);

Opt_trace_object trace_command(&thd->opt_trace);

Opt_trace_array trace_command_steps(&thd->opt_trace, "steps");

...

case SQLCOM_SELECT:

{

if (!res)

res= execute_sqlcom_select(thd, all_tables);

break;

}

在执行sql操作(如SELECT)前,基于thd->opt_trace创建出trace_command和trace_command_steps。注意:当执行完毕后,这两个变量自动销毁。

那么Opt_trace_context是什么呢?直接看注释:

A per-session context which is always available at any point of execution,

It maintains properties of the session's regarding tracing: enabled/disabled

state, style (all trace on one line, or not, etc), a list of all remembered

traces of previous and current SQL statement (as restricted by OFFSET/LIMIT),

and a pointer to the current (being-generated) trace (which itself has a

pointer to its current open object/array).

简单来说就是thd->opt_trace存了很多上下文信息。这些信息在整个query执行过程中都是需要的。最上面的代码中:

Opt_trace_start ots(thd, all_tables, lex->sql_command, &lex->var_list,

thd->query().str, thd->query().length, NULL,

thd->variables.character_set_client);

就是用来初始化和赋值thd->opt_trace的。当执行完毕后,ots所在的函数体mysql_execute_command退出时就自动销毁了,thd->opt_trace在ots的析构函数中被销毁。除了

基类为Opt_trace_struct定义在opt_trace.h中。代码用的最多的是两个派生类Opt_trace_object和Opt_trace_array,以及Opt_trace_context

MySQL内核调试_MySQL内核技术之“Opt_trace_系列”相关推荐

  1. mysql存储过程调试_MYSQL存储过程调试过程

    mysql不像oracle有plsqldevelper工具用来调试存储过程,所以有几种简单的方式追踪执行过程: 1.用一张临时表,记录调试过程: 2.直接在存储过程中,增加select xxx,在控制 ...

  2. mysql进程线程_MySQL 内核线程简要分析

    若接触过Oracle的学者,想必应该都知道Oracle的体系结构,Oracle体系结构中涉及的进程诸如:PMON.SMON.LGWR.CKPT.DBWR_N等等 那MySQL里面的线程是怎么样的呢?( ...

  3. MySQL内核调试_内核调试技巧

    举个kernel-panic的例子 [ 2590.185432] Unable to handle kernel paging request at virtual address 00100110 ...

  4. Linux:内核调试之内核魔术键sysrq

    在linux系统下,我们可能会遇到系统某个命令hang住的情况,通常情况下,我们会查看/proc/pid/wchan文件,看看进程处于什么状况,然后进一步查看系统日志或者使用strace跟踪命令执行时 ...

  5. mysql cursor 分页_Mysql 分页技术总结

    Mysql 分页技术总结 Mysql Pagination 1. 使用cursor方式进行数据分页. http://timyang.net/web/pagination/ 对于大结果集的数据,使用cu ...

  6. mysql innodb内幕_Mysql(技术内幕:InnoDB存储引擎)

    什么是事务:事务是数据库的最小执行单元,由用户程序的执行而产生,在事务中对数据库的所有改变一经提交便不再修改,否则事务回滚:事务是为了保证更改数据库数据中间出现差错时前后数据库的一致性: 事务的ACI ...

  7. mysql dba 视频_MySQL DBA入门到高级系列视频教程 [高清完整版]

    其他教程 当前位置:主页 > 编程教程 > 其他教程 > MySQL DBA入门到高级系列视频教程 [高清完整版] MySQL DBA入门到高级系列视频教程 [高清完整版] 教程大小 ...

  8. WindbgPreview虚拟机双机内核调试

    #Windbg虚拟机双机内核调试 做内核调试时,我们经常使用到windbg的虚拟机双机调试,所以这里记录一下配置双机调试的过程,方便查询.另外,微软提供了一个windbgpreview 工具,算是wi ...

  9. java毕业设计汽车维修管理系统源码+lw文档+mybatis+系统+mysql数据库+调试

    java毕业设计汽车维修管理系统源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计汽车维修管理系统源码+lw文档+mybatis+系统+mysql数据库+调试 本源码技术栈 ...

最新文章

  1. uniapp中搜索输入与频繁点击(防抖节流)
  2. virtuoso从电路图导入版图_基于Virtuoso 平台的单片射频收发系统电路仿真与版图设计...
  3. latex设置一级标题样式不居中_Markdown不快速入门
  4. css 透明度_如何使用CSS实现精美视频片头制作
  5. 特斯拉一次把电池容量翻了5倍,新车2秒破百,续航超800公里,公司股价却跌了...
  6. 出现503错误 怎么办
  7. 训练日志 2019.3.20
  8. POJ3264Balanced Lineup(最基础的线段树)
  9. liunx安装jdk,实测有效
  10. 廖雪峰Python教程学习笔记
  11. Jellybean 4.1.1 精简列表+谷歌服务包精简列表
  12. LFMCW雷达测速基础- 多普勒频移和2DFFT
  13. Linux中执行shell脚本的方法,在Linux中执行Shell脚本的4种方法的总结
  14. 问题解决:无法解析的外部符号 _imp_XXXXXXXXX
  15. cebemax hal库 stm32 OLED移植 解析
  16. 坚持自己的坚持,以不二的姿态坚持到底
  17. 揭秘微信对方正在输入……到底表示什么意思?
  18. Android群英传笔记——第三章:Android控件架构与自定义控件讲解
  19. Gradle 的下载安装教程
  20. QQ通讯录系统——用C++模拟实现,学C++必玩项目】

热门文章

  1. agx 安装ros opencv_怎样在ROS下实现基于YOLO的px4无人机目标检测?
  2. mysql一对多分类_mysql一对多结果归类
  3. DirectX11 With Windows SDK--17 利用几何着色器实现公告板效果
  4. 2018华南理工大学程序设计竞赛 H-对称与反对称
  5. 智能路由器-OpenWRT 系列五 (NAS-SMB家庭共享)
  6. 《Spring实战》读书笔记--SpringMVC之forward与redirect
  7. tomcat7.0配置CORS(跨域资源共享)
  8. Sublime3 快捷键
  9. codeigniter文件上传问题
  10. 局域网聊天工具的设计与实现 java设计代写代做代码源代码