前言
我们这里来看一下 performance_schema 存储引擎, 我们常见的那些 general_log, slow_log什么的, 都是基于 performance_schema
它主要是 使用 ha_perfschema 下面 api 来操作 performance_schema 中的信息
我们这里基于 performance_schema.variables_by_thread 这张基于 PERFORMANCE_SCHEMA 的表来调试
这个 引擎和 MEMORY 引擎的差异在于, 这个没有一个专门的 临时存储表数据 的地方, 这个是 每一次迭代, 直接 读取的给定的内存数据结构的数据
MEMORY 引擎是将数据从 内存数据结构/磁盘/网络 上面读取, 然后 数据输入到了 这个真正存在的 “内存表”
performance_schema.variables_by_thread 的表结构创建如下
CREATE TABLE `variables_by_thread` (
`THREAD_ID` bigint(20) unsigned NOT NULL,
`VARIABLE_NAME` varchar(64) NOT NULL,
`VARIABLE_VALUE` varchar(1024) DEFAULT NULL
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8
基于 PERFORMANCE_SCHEMA 的数据表的数据输出
这是一个直接迭代读取内存各种数据的一个存储引擎
整体过程如下, 先调用 m_table->rnd_next 将下一个系统变量的数据读取到 m_row
然后在基于 m_table->read_row 将 m_row 中的数据转换到 字段列表 中
从 mysql 中内存中的数据结构将数据转换到 m_row 的处理如下
将数据从 m_row 转换到 Field 列表, 分别填充 THREAD_ID, VARIABLE_NAME, VARIABLE_VALUE
基于 PERFORMANCE_SCHEMA 的数据表的数据录入
这部分数据表是直接 运行时读取的相关内存结构的数据, 不需要将数据 插入到 PERFORMACE_SCHEMA 的表中
类似于 linux 中的 proc 文件系统, 是一个逻辑上的 文件/数据表
完