当前位置: 首页 > news >正文

为MySQL新增一张performance_schema表 | StoneDB 技术分享会 #4

StoneDB开源地址

https://github.com/stoneatom/stonedb

 

设计:小艾

审核:丁奇、李浩

编辑:宇亭

作者:王若添
中国科学技术大学-软件工程-在读硕士、StoneDB 内核研发实习生

performance_schema 简介

MySQL 启动后会自动创建四个 database

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

其中的 performance schema 用于监控 MySQL server 在一个较低级别的运行过程中的资源消耗、资源等待等情况。它提供了一种在数据库运行时实时检查 server 的内部执行情况的方法,该数据库主要关注数据库运行过程中的性能相关的数据,与更为常见的 information_schema 不同,information_schema 主要关注 server 运行过程中的元数据信息。

performance_schema 中的事件只记录在本地 server 的 performance_schema 中,其表中数据发生变化时不会被写入 binlog 中,也不会通过复制机制被复制到其他 server 中。

表的分类

可以将 performance_schema 库下的表按照监视不同的纬度就行分组。

  • 语句事件记录表,这些表记录了语句事件信息

mysql> show tables like '%statement%';
+----------------------------------------------------+
| Tables_in_performance_schema (%statement%)         |
+----------------------------------------------------+
| events_statements_current                          |
| events_statements_histogram_by_digest              |
| events_statements_history                          |
| events_statements_summary_by_digest                |
| events_statements_summary_by_host_by_event_name    |
| ...                                                |
  • 等待事件记录表,与语句事件类型的相关记录表类似

mysql> show tables like '%wait%';
+-----------------------------------------------+
| Tables_in_performance_schema (%wait%)         |
+-----------------------------------------------+
| data_lock_waits                               |
| events_waits_current                          |
| events_waits_history                          |
| events_waits_history_long                     |
| ...                                           |
  • 事务事件记录表,记录事务相关的事件的表

mysql> show tables like '%transaction%';
+------------------------------------------------------+
| Tables_in_performance_schema (%transaction%)         |
+------------------------------------------------------+
| binary_log_transaction_compression_stats             |
| events_transactions_current                          |
| events_transactions_history                          |
| ...                                                  |

使用场景

对于语句事件记录表中的 events_statements_summary_by_digest 表举例,这个表记录了基于 SQL 语句摘要的统计信息。如果我们想要了解该 stonedb 进程上执行过的所有类型 SQL 的频次,我们可以使用 SELECT DIGEST_TEXT,COUNT_STAR FROM events_statements_summary_by_digest 查询该表,其中

  • DIGEST_TEXT: 这个列是 SQL 语句的标准化版本,即删除了 SQL 语句中的特定数据(例如,具体的值、表名、列名等)后的 SQL 语句。所有逻辑上相同的 SQL 语句(即使具体的值不同)都会有相同的 DIGEST_TEXT。这使得我们可以统计和分析相同逻辑 SQL 语句的执行情况。

  • COUNT_STAR: 这个列是每个 SQL 语句摘要的执行次数。这可以帮助我们识别哪些 SQL 语句被执行的次数最多,可能对系统的性能影响最大。

这个查询返回的结果就是每种 SQL 语句的标准化版本及其执行次数。这可以帮助我们理解哪些类型的 SQL 语句最常被执行,进而可以对这些 SQL 语句进行优化以提高系统的性能。

创建新的元数据表

如果我们希望在 performance_schema 库中新增加一个描述列式二级引擎列相关信息的元数据表 mock_columns,用来描述加载到 mock_columns 的列式数据情况,比如被加载到了 mock 引擎中的列名列号,所属表名,ndv(number of disctinct value)等信息。

以 t1 表为例

create table t1 (c1 int PRIMAEY_KEY);
// 安装二级引擎mock的动态链接库
INSTALL PLUGIN mock SONAME "ha_mock.so";
// 指定t1的二级引擎为mock
ALTER TABLE t1 SECONDARY_ENGINE=ha_mock;

执行下面的 sql 可以将 innodb 中数据 load 到二级引擎 mock 中

ALTER TABLE t1 SECONDARY_LOAD;

在代码层面,我们需要在加载 innodb 表到 mock 引擎(sql_table.cc 中的 secondary_engine_load_table 函数)的同时将各列的元数据信息存起来,比如可以存在一个全局的 meta_column_columns 映射表中,以便之后执行器在查询中可以读到这些列信息。

函数调用栈如下图:

查询元数据表

将 t1 表加载到 mock 引擎中后,我们就可以执行 SELECT * FROM mock_columns 进行查询。

代码实现上简单来说我们需要新建一个类 table_mock_columns 实现 PFS_engine_table 这个抽象类,在深入细节之前,先了解下 MySQL 中存储引擎 handler 接口的基本概念:

MySQL 架构可分为 SQL 层和存储引擎层,而且支持插件式存储引擎,不同的存储引擎只需实现 handler 这个抽象类包含的方法即可作为 MySQL 的引擎进行数据存取,常见的存储引擎有 innodb、myisam 等(上文提到的 mock 引擎也是一种存储引擎)。而负责 MySQL 元数据信息的引擎是 perfschema 引擎。显然 ha_perfschema 需要继承 handler 抽象类,ha_perfschema 类主要的成员变量 PFS_engine_table *m_table,performance_schema 中所有的 table 类都需要继承该抽象类(也可以理解该类的一个主要作用是充当读取记录的游标,详细信息见后文)。

PFS_engine_table 的初始化

PFS_engine_table 中的存在一个类型为 PFS_engine_table_share *的成员变量 m_table_share,
其数据被所有打开该表的句柄共享的。其中包含一些回调函数,如打开表 m_open_table,写操作 m_write_row 和删除所有行 m_delete_all_rows 等。

还包含一个 Plugin_table 类型的代表表定义的变量 m_table_def(类似于 CREATE TABLE 类型 SQL 的形式,包括表名,列名及列类型等信息)。我们需要做的就是在创建 PFS_engine_table 类型的 column 表时填充这些变量和函数。如定义表 mock_columns 的表结构:

Plugin_table table_mock_columns::s_table_def(/* Schema name */"performance_schema",/* Name */"mock_columns",/* Definition */"  TABLE_ID int unsigned NOT NULL,\\n""  TABLE_NAME VARCHAR(64) NOT NULL,\\n""  COLUMN_ID int unsigned NOT NULL,\\n""  NDV bigint unsigned NOT NULL,\\n""  ENCODING varchar(64) DEFAULT NULL,\\n"/* Options */" ENGINE=PERFORMANCE_SCHEMA CHARACTER SET utf8mb4 COLLATE utf8mb4_bin",/* Tablespace */nullptr);
)

实现相关虚函数

PFS_engine_table 中主要的虚函数有以下三个(暂时不关注索引相关的读取函数):

int rnd_init(bool scan)
int rnd_next(void)
int read_row_values(TABLE *table, unsigned char *buf, Field **fields, bool read_all)

如果我们希望在 performance_schema 库下新增一张元数据表,需要重载以上三个方法,rnd_init 函数做一些初始化工作,rnd_next 函数从全局映射表 meta_column_columns 中将下一条记录取到 m_table 游标中,read_row_values 函数负责将 m_table 游标中存储的数据读出并返回。

查询该表时候,MySQL 执行器中的函数调用链如下 (参数已省略):TableScanIterator::Read()→handler::ha_rnd_next()→ha_perfschema::rnd_next()→table_mock_columns::rnd_next(), 执行后会将下一条记录取出到 m_table 游标中暂存,然后 ha_perfschema::rnd_next()会调用 read_row_values()函数, 将 m_table 中的一行数据读出填充到 Field 列表字段查询结束。

最后的查询结果如下:

mysql> SELECT * FROM `mock_columns`;
+----------+------------+------------+-----+------------+
| TABLE_ID | TABLE_NAME |  COLUMN_ID | NDV |  ENCODING  |
+----------+------------+------------------+------------+
|       87 |         t1 |          0 |   0 | dictionary |
+----------+------------+------------------+------------+
1 row in set (4.68 sec)

删除元数据表

performance_schema 中的表是不进行持久化的,这些表主要用来收集和存储 MySQL 服务器的实时性能数据,以便于用户进行性能分析和问题诊断。这些数据存储在内存中,并且在 MySQL 服务器重启后会被清空。这种设计是有意为之的,因为 performance_schema 中的数据主要用于实时性能分析,而不是长期存储。如果需要长期保留这些数据,我们需要自己定期收集并存储这些数据。

用户也可以执行如下 SQL 将从 innodb 主引擎中加载到二级引擎 mock 的表卸手动载掉:

ALTER TABLE t1 SECONDARY_UNLOAD;

执行表卸载的时候需要自动把加载到二级引擎 mock 上的表中对应的列信息删除掉,对应到源码层面就是当用户执行该 SQL 时,mock 引擎将之前加载到 meta_mock_columns 映射表中需要被卸载表的数据清除掉。

结束语

经过对 performance_schema 相关表的介绍和源码探索,我们已对如何在 performance_schema 库中创建一张我们需要的元数据表有了较为详细的理解。希望这篇分析能为您在深入研究或进行二次开发时提供有益的参考。

本文基于 MySQL 8.0.33 源码进行分析

StoneDB 介绍

StoneDB 是石原子科技自主设计研发的国内首款完全兼容于 MySQL 生态的开源 一体化实时 HTAP 数据库产品,具备行列混存、智能索引等核心特性,为 MySQL 数据库提供在线数据实时就近分析服务,能够高效解决 MySQL 数据库在分析型应用场景中面临的能力问题。同时,StoneDB 使用多存储引擎架构的设计,事务引擎具有数据强一致特性,具备完整的事务并发处理能力,使得 StoneDB 可以替代 MySQL 数据库满足在线事务处理场景的需求,使用 MySQL 的用户,通过 StoneDB 可以实现 TP+AP 混合负载,分析性能提升 10 倍以上显著提升,不需要进行数据迁移,也无需与其他 AP 集成,弥补 MySQL 分析领域的空白。

开源仓库

https://github.com/stoneatom/stonedb

 

 

相关文章:

为MySQL新增一张performance_schema表 | StoneDB 技术分享会 #4

StoneDB开源地址 https://github.com/stoneatom/stonedb 设计:小艾 审核:丁奇、李浩 编辑:宇亭 作者:王若添 中国科学技术大学-软件工程-在读硕士、StoneDB 内核研发实习生 performance_schema 简介 MySQL 启动后会自动创建四…...

2023/8/12总结

增加了管理员功能点:(管理标签和分类) 另外加了一个转换成pdf的功能 主要是通过wkhtmltopdf实现的,之前看过很多说用adobe的还有其他但是都没成功。 然后就是在学习websocket和协同过滤算法实现,还只是初步了解了这些。…...

win10电脑npm run dev报错解决

npm run dev报错解决 出现错误前的操作步骤错误日志解决步骤 出现错误前的操作步骤 初始化Vue项目 $ npm create vue3.6.1创建项目文件夹client Vue.js - The Progressive JavaScript Framework✔ Project name: › client ✔ Add TypeScript? › No ✔ Add JSX Support? …...

如何使用PHP编写爬虫程序

在互联网时代,信息就像一条无休无止的河流,源源不断地涌出来。有时候我们需要从Web上抓取一些数据,以便分析或者做其他用途。这时候,爬虫程序就显得尤为重要。爬虫程序,顾名思义,就是用来自动化地获取Web页…...

分布式 - 服务器Nginx:一小时入门系列之HTTP反向代理

文章目录 1. 正向代理和反向代理2. 配置代理服务3. proxy_pass 命令解析4. 设置代理请求headers 1. 正向代理和反向代理 正向代理是客户端通过代理服务器访问互联网资源的方式。在这种情况下,客户端向代理服务器发送请求,代理服务器再向互联网上的服务器…...

Android Fragment (详细版)

经典好文推荐,通过阅读本文,您将收获以下知识点: 一、Fragment 简介 二、Fragment的设计原理 三、Fragment 生命周期 四、Fragment 在Activity中的使用方法 五、动态添加Fragment到Activity的方法 六、Activity 中获取Fragment 七、Fragment 获取宿主Activity的方法 八、两个…...

如何使用Flask-RESTPlus构建强大的API

如何使用Flask-RESTPlus构建强大的API 引言: 在Web开发中,构建API(应用程序接口)是非常常见和重要的。API是一种允许不同应用程序之间交互的方式,它定义了如何请求和响应数据的规范。Flask-RESTPlus是一个基于Flask的…...

UGUI事件系统EventSystem

一. 事件系统概述 Unity的事件系统具有通过鼠标、键盘、游戏控制柄、触摸操作等输入方式,将事件发送给对象的功能。事件系统通过场景中EventSystem对象的组件EventSystem和Standalone Input Module发挥功能。EventSystem对象通常实在创建画布的同时被创建的&#xf…...

redis学习笔记(三)

文章目录 key操作(1)查找键(2)判断键是否存在(3)查看键的的值的数据类型(4)删除键以及键对应的值(5)查看键的有效期(6)设置key的有效期…...

Go语言template模板语法

Go语言模板语法 文章目录 <center> Go语言模板语法连接前后端的符号: {{}}注释管道(pipeline)变量条件判断range 关键字with 关键字比较函数自定义函数嵌套模板模板继承 连接前后端的符号: {{}} 模板语法都包含在{{}}之中,其中{{.}}中的.表示当前对象.在传入一个结构体对…...

Python-OpenCV中的图像处理-物体跟踪

Python-OpenCV中的图像处理-物体跟踪 物体跟踪 物体跟踪 现在我们知道怎样将一幅图像从 BGR 转换到 HSV 了&#xff0c;我们可以利用这一点来提取带有某个特定颜色的物体。在 HSV 颜色空间中要比在 BGR 空间中更容易表示一个特定颜色。在我们的程序中&#xff0c;我们要提取的…...

本地Linux 部署 Dashy 并远程访问教程

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 转载自cpolar极点云文章&#xff1a;本地Linux 部署 Dashy 并远程访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你…...

6.2 口令破解攻击

数据参考&#xff1a;CISP官方 目录 口令安全问题口令破解攻击口令破解安全防护口令使用安全管理 一、口令安全问题 什么是口令 身份验证的机制&#xff0c;俗称 “密码"&#xff0c;对应英文单词为 password成本较低&#xff0c;得到广泛应用信息安全中的 “密码”…...

SSL账号申请及配置

摘自个人印象笔记https://app.yinxiang.com/fx/db244155-c858-4d8a-93a8-08071d168dc8ssl申请平台&#xff1a;https://blog.freessl.cn/ ajian51168qq.com … 操作说明&#xff1a;https://blog.freessl.cn/acme-quick-start/ nginx配置&#xff1a; upstream local_tomcat{s…...

JS代码混淆加密有什么用?

JS加密、JS混淆&#xff0c;有这些用&#xff1a; 1、前端JS代码&#xff0c;如果不加密&#xff0c;它人可以随便copy、任意修改。自己写的代码&#xff0c;可以轻易成为别人的成果。 对JS代码混淆加密&#xff0c;则可以防止这种他人随意白嫖的问题&#xff0c;代码是自己辛…...

Oracle的function執行DML操作

Oracle的function並不支持DML操作&#xff0c;但可以使用一段指令&#xff0c;讓這段pl/sql成為獨立的事務。 当使用 PRAGMA AUTONOMOUS_TRANSACTION 时&#xff0c;可以在一个过程或函数的独立代码块中执行数据库操作&#xff0c;而不受外部事务的影响。这意味着内部事务的提交…...

大语言模型:LLM的概念是个啥?

一、说明 大语言模型&#xff08;维基&#xff1a;LLM- large language model&#xff09;是以大尺寸为特征的语言模型。它们的规模是由人工智能加速器实现的&#xff0c;人工智能加速器能够处理大量文本数据&#xff0c;这些数据大部分是从互联网上抓取的。 [1]所构建的人工神…...

21 | 朝阳医院数据分析

朝阳医院2018年销售数据为例,目的是了解朝阳医院在2018年里的销售情况,通过对朝阳区医院的药品销售数据的分析,了解朝阳医院的患者的月均消费次数,月均消费金额、客单价以及消费趋势、需求量前几位的药品等。 import numpy as np from pandas import Series,DataFrame impo…...

二十二、责任链模式

目录 1、使用demo演示责任链模式2、传统方案解决oa系统审批3、传统方案解决oa系统审批存在的问题4、职责链模式基本介绍5、职责链模式原理类图6、职责链模式解决oa系统采购审批7、职责链模式的注意事项和细节8、职责链模式的实际使用场景举例 1、使用demo演示责任链模式 学校o…...

opencv,opengl,osg,vulkan,webgL,opencL,cuda,osg,vtk,ogre的区别

OpenCV OpenCV是一个基于BSD许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C 类构成&#xff0c;同时提供了Python、Ruby、MATLAB等…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...