为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

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/68191.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中睿天下入选河南省网信系统2023年度网络安全技术支撑单位

近日,河南省委网信办发布了“河南省网信系统2023年度网络安全技术支撑单位名单”,中睿天下凭借出色的网络安全技术能力和优势成功入选。 本次遴选由河南省委网信办会同国家计算机网络与信息安全管理中心河南分中心(以下简称安全中心河南分中心…

高斯模糊与图像处理(Gaussian Blur)

高斯模糊在图像处理中的用途及其广泛,除了常规的模糊效果外,还可用于图像金字塔分解、反走样、高低频分解、噪声压制、发光效果等等等等。正因为高斯模糊太基础,应用太广泛,所以需要尽可能深入认识这个能力,避免在实际…

AttentionFreeTransformer 源码解析(一):AFTFull、AFTSimple、AFTLocal

我觉得源码写的很好懂,我就不加注释了,直接上计算流程图。 AFTFull class AFTFull(nn.Module):def __init__(self, max_seqlen, dim, hidden_dim64):super().__init__()max_seqlen: the maximum number of timesteps (sequence length) to be fed indim…

DP(区间DP)

石子合并 设有 N 堆石子排成一排,其编号为 1,2,3,…,N。 每堆石子有一定的质量,可以用一个整数来描述,现在要将这 N 堆石子合并成为一堆。 每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆…

cesium学习记录06-视图、场景与相机

一、视图(Viewer) viewer是cesium的核心类,是一切的开端。通过new Cesium.Viewer(container, options)来创建一个Viewer对象,而通过这个 Viewer对象,可以添加图层、实体、相机控制等,以及设置一些全局属性…

esp8266使用arduinoJson与tft_espi库发生冲突解决方法

esp8266使用arduinoJson与tft_espi库发生冲突解决方法 arduinoJson与tft_espi库发生冲突解决方法下载arduinoJson5.0版本的,不要用最新版本 示范代码: // Copyright Benoit Blanchon 2014 // MIT License // // Arduino JSON library // https://git…

Unity游戏源码分享-仿帝国时代游戏Demo-uRTS Toolkit

Unity游戏源码分享-仿帝国时代游戏Demo-uRTS Toolkit 游戏的架构值得参考 项目地址:https://download.csdn.net/download/Highning0007/88189905

Pycharm 双击启动失败?

事故 双击 Pycharm 后,出现加载工程,我不想加载这个工程,就点击了弹出的 cancle 取消按钮。然后再到桌面双击 Pycharm 却发现无法启动了。哪怕以管理员权限运行也没用,就是不出界面。 原因未知 CtrlshiftESC 打开后台&#xff…

易服客工作室:如何创建有用的内容日历

利用技巧和工具优化您的内容营销效率和效果。创建一个内容日历,您的整个团队都会从中受益! 欢迎来到熙熙攘攘、瞬息万变的内容营销世界,在这里,截止日期到来的速度比喝咖啡的猎豹还要快。 现在,想象一下在没有地图、…

MapBox加载不同风格

初始化MapBox地图: var map new mapboxgl.Map({container: map,zoom: 3,center: [105, 34],//此处更改地图风格style: mapbox://styles/mapbox/satellite-v9,hash: false,});1.户外地图(mapbox://styles/mapbox/basic-v9)新版:&a…

设计模式之模板方法

一、概述 定义一个操作中的算法的骨架,将一些步骤延迟到子类中。 TemplateMethod使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 二、适用性 1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。 2.各子类中公共…

YOLOv5修改注意力机制CBAM

直接上干货 CBAM注意力机制是由通道注意力机制(channel)和空间注意力机制(spatial)组成。 传统基于卷积神经网络的注意力机制更多的是关注对通道域的分析,局限于考虑特征图通道之间的作用关系。CBAM从 channel 和 sp…

Kafka与Zookeeper版本对应关系

文章目录 了解版本对应Kafka安装包Kafka源码包 了解 比如: kafka_2.11-1.1.1.jar包 其中2.11表示的是Scala的版本,因为Kafka服务器端代码完全由Scala语音编写。”-“后面的1.1.1表示的kafka的版本信息。遵循一个基本原则,Kafka客户端版本和服…

MySQL5.7数据库、Navicat Premium1.6可视化工具安装教程【详细教程】

文章目录 一、MySQL、Navicat、注册机地址二、安装(一)、MySQL安装(二)、Navicat Premium安装(三)、集活Navicat Premium 三、遇到的问题1、Are you sure your navicat has not beenpatched/modified befor…

Spring 事务管理

目录 1. 事务管理 1.1. Spring框架的事务支持模型的优势 1.1.1. 全局事务 1.1.2. 本地事务 1.1.3. Spring框架的一致化编程模型 1.2. 了解Spring框架的事务抽象(Transaction Abstraction) 1.2.1. Hibernate 事务设置 1.3. 用事务同步资源 1.3.1…

Malloc动态内存分配

在C语言中我们会使用malloc来动态地分配内存,这样做的一个主要理由是有些数据结构的大小只有在运行时才能确定。例如,如果你正在编写一个程序,需要用户输入一些数据,但你不知道用户会输入多少数据,那么你就需要使用动态…

vue3使用pinia和pinia-plugin-persist做持久化存储

1、安装依赖 pnpm i pinia // 安装 pinia pnpm i pinia-plugin-persist // 安装持久化存储插件2、main.js引入 import App from ./App.vue const app createApp(App)//pinia import { createPinia } from pinia import piniaPersist from pinia-plugin-persist //持久化插件 …

Python中enumerate用法详解

目录 1.简介 2.语法 3.参数 4.返回值 5.详解 6.实例 7.补充 1.简介 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 2.语法 以下是 enumerate() 方法的语…

Qt应用开发(基础篇)——堆栈窗口 QStackedWidget

一、前言 QStackedWidget继承于QFrame,QFrame继承于QWidget,是Qt常用的堆栈窗口部件。 框架类QFrame介绍 QStackedWidget堆栈窗口,根据下标切换,一次显示一个小部件,常用于应用界面切换、图片轮询播放等场景。 二、QSt…

通义千问开源模型部署使用

首先可以参考modelScope社区给出的使用文档,已经足够全面 通义千问-7B-Chat 但在按照文档中步骤部署时,还是有些错误问题发生,可以搜索参考的解决方式不多,所以记录下来 个人电脑部署 这里不太建议使用自己的笔记本部署通义千…