MySQL使用了称之为psi/pfs的一系列文件和结构来进行performance监控。Psi全称为performance schema interface,pfs全称为performance storage。

该机制使用pthead来进行操作,其首先定义了pthread的线程存储变量(pfs.cc):

thread_local_key_t THR_PFS;

thread_local_key_t THR_PFS_VG; // global_variables

thread_local_key_t THR_PFS_SV; // session_variables

thread_local_key_t THR_PFS_VBT; // variables_by_thread

thread_local_key_t THR_PFS_SG; // global_status

thread_local_key_t THR_PFS_SS; // session_status

thread_local_key_t THR_PFS_SBT; // status_by_thread

thread_local_key_t THR_PFS_SBU; // status_by_user

thread_local_key_t THR_PFS_SBH; // status_by_host

thread_local_key_t THR_PFS_SBA; // status_by_account

bool THR_PFS_initialized= false;

这里的thread_local_key_t实际上是pthread_key_t,即pthread线程存储变量。pthread_key_t的使用就像一个全局变量,哪个线程都可以用,但是实际上对应了线程内部的变量值,可以参见该例:http://www.jianshu.com/p/d52c...。pthread规定,线程存储变量thread_local_key_t必须要先初始化。MySQL在pfs_server.cc中对这些变量统一初始化:

void pre_initialize_performance_schema()

{

pfs_initialized= false;

init_all_builtin_memory_class();

PFS_table_stat::g_reset_template.reset();

global_idle_stat.reset();

global_table_io_stat.reset();

global_table_lock_stat.reset();

if (my_create_thread_local_key(&THR_PFS, destroy_pfs_thread))

return;

if (my_create_thread_local_key(&THR_PFS_VG, NULL)) // global_variables

return;

if (my_create_thread_local_key(&THR_PFS_SV, NULL)) // session_variables

return;

if (my_create_thread_local_key(&THR_PFS_VBT, NULL)) // variables_by_thread

return;

if (my_create_thread_local_key(&THR_PFS_SG, NULL)) // global_status

return;

if (my_create_thread_local_key(&THR_PFS_SS, NULL)) // session_status

return;

if (my_create_thread_local_key(&THR_PFS_SBT, NULL)) // status_by_thread

return;

if (my_create_thread_local_key(&THR_PFS_SBU, NULL)) // status_by_user

return;

if (my_create_thread_local_key(&THR_PFS_SBH, NULL)) // status_by_host

return;

if (my_create_thread_local_key(&THR_PFS_SBA, NULL)) // status_by_account

return;

THR_PFS_initialized= true;

}

注意,这个初始化只做一次,以后创建线程时直接使用即可。上的第一个变量THR_PFS就是我们要使用的。

如何使用

使用上的方式初始化,首先要set相应的value:

/**

@brief Execute the JOIN generated by parallel

@param join [in] JOIN structure

*/

void execute_join(parallel_execution_thread_arg* parallel_arg) {

/*

* Get the parameter:

* 1. JOIN

* 2. pfs

*/

/// TODO: do we need to handle error?

std::cout << "****************I am in worker thread*****************" << std::endl;

/// Get join

JOIN* join= parallel_arg->join;

/// Get and Set pfs

PSI_thread* pfs= parallel_arg->pfs;

pfs_set_thread_v1(pfs);

/// Delete

delete parallel_arg;

/// Set the new thread context

my_thread_set_THR_THD(join->thd);

/// Execute

join->exec();

}

上面的函数是我在MySQL中新加入的代码,其中使用pfs_set_thread_v1进行set操作,即把当前THR_PFS对应的值设置为pfs。

get操作。由于我们加入了boost线程库,所以当启动一个线程时需要把JOIN结构和pfs结构传入。思路是首先通过THR_PFS获得pfs线程句柄,作为参数传入到新的线程中。再新线程执行函数中,把pfs线程句柄set进去。具体在sql_select.cc中,我们加入了如下代码:

/**

Parallel execution.

@details When a JOIN is parallel, its JOINs will execute parallelly.

Put all JOINs into thread pool to execute.

*/

void JOIN::parallel_exec_joins() {

for (uint i= 0; i < m_parallel_joins.size(); i ++) {

/// Delete it in join->exec

parallel_execution_thread_arg* parallel_arg= new parallel_execution_thread_arg();

/// Set join

JOIN* join= m_parallel_joins[i];

parallel_arg->join= join;

/// Set pfs

PSI_thread* pfs= pfs_get_thread_v1();

parallel_arg->pfs= pfs;

/// Thread pool

generic_thread_pool.SubmitTask(execute_join, (parallel_execution_thread_arg* &&)parallel_arg);

}

}

可以看到,我们通过MySQL的pfs_get_thread_v1获得pfs线程句柄传入到新的线程。

上面的例子是针对pfs的线程。对于MySQL普通线程的例子在上面的execute_join也能找到。注意里面有一行code:

/// Set the new thread context

my_thread_set_THR_THD(join->thd);

这里就是把当前的thd设置到pthread中。所以我们看到,在MySQL中的很多地方都用到了这个东西,用法也已经明确了。

数据库mysql局部变量_MySQL内核技术之“pthead局部变量”相关推荐

  1. MySQL内核调试_MySQL内核技术之“Opt_trace_系列”

    MySQL代码使用了大量Opt_trace相关结构,先看代码中的一段注释: This optimizer trace is aimed at producing output, which is re ...

  2. 数据库mysql工序_网易杭研总结:数据库高可用技术之道(4)

    数据库作为IT系统中最关键的服务之一,其可用性一直是系统设计中的重点考虑因素.同时,由于数据库有数据有状态的天性,数据库高可用有其天然的复杂性和难点,云原生架构下尤其如此,是一个值得深入探讨的课题.本 ...

  3. 腾讯云数据库 MySQL 8.0 正式上线,性能全面超越官方版本

    7月8日,拥有60+全新特性,性能全面超越官方版本的腾讯云MySQL 8.0正式发布.在全新引擎的驱动下,在MySQL官方版本大幅度提升性能的基础上,腾讯云MySQL8.0数据库通过优化锁系统,事务系 ...

  4. mysql显示表_MYSQL显示表

    [MySQL]命令行工具和基本操作 原文:[MySQL]命令行工具和基本操作 一 MySQL命令行工具  (查看帮助 ---help,或 -?) 1)MySQL MySQL是一个简单的SQL外壳(有G ...

  5. mysql内核架构_热血江湖mysql内核技术之门派数据库表结构说明

    小编之前已经多次和大家说过了一个概念,不管你打算架设的是什么游戏什么版本都必须熟悉它的数据库整体结构.今天小编要说的是热血江湖私服游戏中最难的MYSQL内核技术,对于玩家来说MYSQL技术无疑是最难的 ...

  6. mysql数据库优化大全_MySQL数据库优化技巧大全

    简介: MySQL数据库优化技巧大全 MySQL优化三大方向 ① 优化MySQL所在服务器内核(此优化一般由运维人员完成). ② 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进 ...

  7. 前沿分享|阿里云数据库资深技术专家 姚奕玮:AnalyticDB MySQL离在线一体化技术揭秘

    简介:本篇内容为2021云栖大会-云原生数据仓库AnalyticDB技术与实践峰会分论坛中,阿里云数据库资深技术专家 姚奕玮关于"AnalyticDB MySQL离在线一体化技术揭秘&quo ...

  8. 云图说|云数据库MySQL内核小版本升级全攻略

    华为云有新的内核小版本发布时,您可以在"实例管理"页面看到内核小版本升级提示,具体操作方法及注意事项"云图说"来为您详解: 点击"了解更多" ...

  9. mysql 数据库表重建_mysql 数据库表重建

    数据库内核月报 - 2015 / 09-MySQL · 捉虫动态 · 建表过程中crash造成重建表失败 问题描述 主库的create table语句传到备库,备库SQL线程执行过程中报错: Erro ...

  10. 数据库(MySQL)开发技术题库

    数据库(MySQL)开发技术题库 软件工程大二下 选择+填空+简答 选择题 1.SQL语言具有数据操作功能,SQL语言的一次查询的结果是一个___D___ A) 数据项      B) 记录      ...

最新文章

  1. vba 当前文件名_值得收藏的VBA编程常用代码3640
  2. 放张载玻片就能放大一万倍,普通光学显微镜都馋哭了 | Nature子刊
  3. bash中通过设置PS1变量改变提示符颜色
  4. 《快速软件开发——有效控制与完成进度计划》
  5. sql server 2008学习12 事务和锁
  6. java.lang包—基本类型的封装类
  7. nyoj_111_分数加减法_201311281341
  8. 抱歉(HDU-1418)
  9. Hadoop入门进阶步步高(四)-测试Hadoop
  10. C++---堆代码实现
  11. 【Django 2021年最新版教程25】模板语言 前端for循环怎么用 实例
  12. 调制方式性能比较--BER,频带效率的极限
  13. 用什么软件测试钢结构受力,钢结构平台承载力检测
  14. 电商业务中的五大机器学习问题!
  15. php保存pdf旋转90度,怎么将PDF文件向左旋转90度?这款软件还有旋转功能!
  16. 移动跨平台框架React Native 基础教程【01】
  17. C# Email发送邮件
  18. 5GC 网元介绍(AMF、SMF、UPF、UDM、PCF)
  19. 【PCL】NDT点云配准(Registration)
  20. Compose基础-SideEffect(二)

热门文章

  1. 焕新:CANape 19真香~
  2. 关于CAN APE的使用一些记录
  3. talib python文档_GitHub - HuaRongSAO/talib-document: talib学习 talib中文翻译 talib中文文档...
  4. 【Visual Assist X】VAssistX的安装和使用
  5. cs231n softmax作业笔记
  6. Microsoft Store 微软商店中 APP 独立安装包下载方法
  7. 施乐s2110进入维修模式_施乐S2110维修手册(无密码)
  8. freeMarker导出word富文本带图片或者指定目录下的图片
  9. 蔡高厅高等数学18-函数在一点处的连续、函数在区间内的连续、两类间断点的判断
  10. 社交App系统架构--自己亲手写的App系统(含github源码)