MySQL的InnoDB的页里面存了些什么

news2024/12/25 9:34:10

文章目录

  • 创建新表页的信息
  • 新增一条数据
  • 根据页号找数据信息
  • 脚本代码
    • py_innodb_page_info
    • 根据地址计算页号
    • 根据页号计算起始地址

主要介绍数据页里面有哪些内容,一行数据在文件里面是怎么组织的

创建新表页的信息

CREATE TABLE `test8` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '姓名',
  `finish` tinyint(1) DEFAULT '0' COMMENT '完成状态',
  `uid` varchar(64) NOT NULL DEFAULT '' COMMENT '用户ID信息',
  `external1` varchar(512) NOT NULL DEFAULT '' COMMENT '大字段信息1',
  `external2` varchar(512) NOT NULL DEFAULT '' COMMENT '大字段信息2',
  `external3` varchar(512) NOT NULL DEFAULT '' COMMENT '大字段信息3',
  `external4` varchar(512) NOT NULL DEFAULT '' COMMENT '大字段信息4',
  `external5` varchar(512) NOT NULL DEFAULT '' COMMENT '大字段信息5',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '缓存时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试信息表8';

新建一个测试表test8,然后看看缓冲池里的页的变化。把表test8的一些页加载进来了,看最后一列INDEX_NAME有个PRIMARYidx_name两个索引的名称,一个是主键索引,一个是辅助索引;因为InnoDB是聚簇索引形式的,主键索引的叶子节点就包含了数据。
在这里插入图片描述

FILE_SPACE_HEADER页增加了1个,是把test8FILE_SPACE_HEADER页加载进来了,IBUF_BITMAP页多了7个是除了加载了test8的这个页,还加载了其他test数据库下的表进来…
在这里插入图片描述

再看这个表空间里面有什么,7个页112k,MySQL初始创建表不是只有96k么?为啥这多了16k;MySQL建一个一般的表确实只给6个页的空间;但是我们这边张表多了个索引,它就给索引也分配了一个页。试了下如果两个索引的话,会多给两个页,就是多几个索引就多几个页。
在这里插入图片描述

使用命令hexdump -C test8.ibd输出页格式化的二进制信息;页的类型信息在第25,26两个字节的位置。

截图里面的 * 号代表这一行的数据和上一行一样,省略了

在这里插入图片描述在这里插入图片描述
主键索引页和辅助索引页类型的值都是0x45bf,所以他们都是INDEX页,主键索引叶子节点会存放数据,辅助索引就是单纯的辅助索引,要整行数据需要再到主键索引下去找。

所有的页面类型信息,见源码storage/innobase/include/fil0fil.h
在这里插入图片描述

新增一条数据

INSERT INTO `test8` (`name`, `finish`, `uid`, `external1`, `external2`, `external3`, `external4`, `external5`, `create_time`)
VALUES
	('name001', 0, 'uid001', 'aaaaaaaa', 'bbbbbbbb', 'cccccccc', 'dddddddd', 'eeeeeeee', '2024-08-04 18:09:35');

页还是那么几个,没什么变化,NEWEST_MODIFICATION变化了,这代表LSN号;我们每次提交事务的时候,数据都会刷新到redo log里面,会有这个日志序列号LSN,代表页面有变化了;行数就像我们看到的1行,数据的大小变了。
在这里插入图片描述
LSN在页中的位置是页面类型前面的8个字节,可以自己输出看看文件里面的前8个字节的数转换成十进制是不是这么多。

再用hexdump命令看看test8.ibd文件
主键索引页的大小92个字节:画红线的字节前面7个字节是varchar字符串的这个记录每个信息的长度,逆序存放的的;再后面1个字节是代表哪个位置为null的,后面5个字节是记录头信息;第一个蓝线是主键ID,紧接着是Transaction IDRoll Pointer,剩下的看得出来是我们插入的记录,后面划红线的4个字节不知道是什么意思,试了下多插入几条,发现每条记录后面的数据都是 66 af 53 5f,加起来92个字节
在这里插入图片描述

辅助索引页的大小21个字节:索引字段name0017个字节,主键ID 8个字节,还有6个字节对应的事什么不知道,下一个记录来了才有数据,加起来21个字节
在这里插入图片描述

下面我们到一个数据多一点的表里面去找找数据

根据页号找数据信息

我这边前面测试的时候建过一个test2表,插入了上百万条数据,我们看看缓冲池里面加载了些什么数据进来,这是目前在缓冲池里面的页的数据
在这里插入图片描述
我们看看页号101的数据是哪些数据,计算出它的起始地址是0x194000,它是一个INDEX页,独立表空间里面基本上都是数据页了;0x1242 的十进制是4674;查询出来就是这条数据了
在这里插入图片描述
在这里插入图片描述

我们再找个二级索引页,执行下索引列的统计sqlMySQL缓冲池就会把索引页加载进来了
在这里插入图片描述
我们看看页号23751的数据是哪些数据,计算出它的起始地址是0x1731c000,它是一个二级索引页(第56-64个字节有值,就是二级索引页,表示修改当前页的最大事务ID,仅在二级索引中定义,聚簇索引没有),独立表空间里面基本上都是数据页了;0x03e7cf 的十进制是255951;查询出来这行数据的索引列就是这个
在这里插入图片描述在这里插入图片描述
好了,差不多就写这么多了,还有不少其他不明白的细节,以后再慢慢了解吧!

脚本代码

py_innodb_page_info

https://github.com/yjysanshu/py_innodb_page_info

根据地址计算页号

page_size_bytes = 16 * 1024     # 16k

# hexdump 打印出来的地址
hex_address = "00004010"
address = int(hex_address, 16)

print("页号: " + str(address // page_size_bytes))
print("偏移地址: " + str(hex(address % page_size_bytes)))

根据页号计算起始地址

page_no = 23502
print(hex(page_no * page_size_bytes))

以下几张备用的图,找不到规律,以后再看;这是二级索引页的后面几个字节,不知道代表什么意思?有了解的大佬帮我解解惑,感激不尽!
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android开发-使用FFmpeg-Android进行音视频处理

使用 FFmpeg-Android 进行音视频处理 1. 前言2. FFmpeg-Android 简介3. 功能介绍及实现3.1. 视频字幕添加Kotlin 代码示例:3.2. 尺寸剪切Kotlin 代码示例:3.3. 添加或去除水印Kotlin 代码示例:3.4. 时长截取Kotlin 代码示例:3.5. …

【十万个为什么】强磁场环境用什么编码器好?磁编为什么不怕强磁场?磁编与光编哪一个抗干扰强?

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、案例场景1:场景2: 二、为什么磁编可以在磁场中工作三、磁编为什么不怕强磁场&#xf…

LVS实战项目

LVS简介 LVS:Linux Virtual Server,负载调度器,内核集成,章文嵩,阿里的四层SLB(Server LoadBalance)是基于LVSkeepalived实现。 LVS集群的类型 lvs-nat : 修改请求报文的目标IP, 多目标 IP 的 DNAT lvs-dr &#xff…

vpp编译安装(Ubuntu 16.04)

1、编译 git clone -b stable/1801 https://github.com/FDio/vpp.git cd vpp ./extras/vagrant/build.sh && make 报错 解决: 操作系统是Ubuntu 18.04.5 换成ubuntu 16即可

step11:打包qml程序

文章目录 0.文章介绍1.增加环境变量2.复制RDU.exe3.找到Qt安装路径4.操作qt 6.4.3(minGW)命令框 0.文章介绍 1.增加环境变量 电脑里安装了两个版本的QT,最好把现在打包的QT版本环境变量移到最前面 添加完成环境变量之后,再在wi…

力扣高频SQL 50题(基础版)第四十一题之1517.查找拥有有效邮箱的用户

文章目录 力扣高频SQL 50题(基础版)第四十一题1517.查找拥有有效邮箱的用户题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题(基础版)第四十一题 1517.查找拥有有效邮箱的用户 题目说明 表: Users -----------…

c++语言学习,isalnum()函数分析

1:isalnum() 函数说明: 检查参数c,是否为英文字母或阿拉伯数字 2:函数原型: int isalnum(int c) 3:函数参数: 参数c,为检测字符 4:返回值: 若参数c为字母或数字&#…

全网最详细教你学习LVS(Linux virual server)

LVS 官网 : http://www.linuxvirtualserver.org/ //(可参考) 一、LVS定义: 是一个基于 Linux 操作系统的开源软件负载均衡项目。 LVS 主要用于实现服务器的负载均衡和高可用性。它工作在网络的第四层,可以对…

ERP帮助中心的卓越实践:以用友ERP为例的成功之路

引言 在数字化转型的浪潮中,企业资源规划(ERP)系统作为企业管理的核心工具,其有效应用直接关系到企业的运营效率与竞争力。然而,ERP系统的复杂性和多功能性往往让用户在初识阶段感到困惑。因此,构建一个高…

Boost搜索引擎:网络模块的构建

网页展示界面 每个网页界面都有他相应的代码构成 按F12键 就会出现.html文件代码 上图是csdn当前网页文件代码,所以说要想,设计好看的网页文件需要去学对应的只是,我没有怎么接触过,所以网页代码就不能为大家讲解了。 网页展示的…

软件设计之JavaScript(2)

软件设计之JavaScript(2) 【狂神说Java】JavaScript最新教程通俗易懂 学习内容: 软件开发技能点参照:软件开发,小白变大佬,这套学习路线让你少走弯路是认真的,欢迎讨论 软件开发技能点顺序参照:Java学习…

【鸿蒙开发基础学习】组件导航 (Navigation)

组件导航 (Navigation) Navigation 是路由容器组件,一般作为首页的根容器,包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。Navigation 组件适用于模块内和跨模块的路由切换,一次开发,多端部署场景。通过组件级路由能力…

视频剪辑SDK,人脸美化与滤镜特效,焕发直播新活力

在数字化浪潮席卷全球的今天,直播已成为连接品牌与消费者、创作者与观众的重要桥梁。为了在激烈的直播竞争中脱颖而出,提供高质量、富有创意的直播内容成为关键。美摄科技,作为视频处理技术的先行者,携手其强大的视频剪辑SDK解决方…

Python:构建一个算法预测类型

准确工作:需要下载music.csv 已上传 构建模型内容: import pandas as pd music_data pd.read_csv(music.csv) # music_data Xmusic_data.drop(columns[genre]) # 删除的那一列的名字为genre Ymusic_data[genre] # 访问指定的列 Y 预测用的是决策树&…

leetcode日记(65)组合

一眼递归&#xff0c;第一版写出的代码写成了排列组合&#xff0c;然后修改后&#xff1a; class Solution { public:vector<vector<int>> combine(int n, int k) {vector<int> vec;vector<vector<int>> result;for(int i1;i<n;i){vec.push_…

[MAE] Masked Autoencoders Are Scalable Vision Learners

1、目的 NLP领域的自监督预训练非常成功&#xff0c;CV领域可以参考其masked autoencoding方法。主要挑战有&#xff1a; 1&#xff09;CNN不会直接用mask tokens或者positional embeddings&#xff0c;而是在规则网格上运算 -> Vision Transformers (ViT) 2&#xff09;Lan…

SQL注入sqli-labs-master关卡四

第四关如下&#xff1a; 查看其php代码&#xff1a;发现其与前三关的区别就在于id这里。即使用")进行逃离。 则步骤与前三关一致&#xff0c;细节上改变即可。 输入?id1判断是字符型还是数字型注入 输入?id-1") union select 1,2,3--只显示2&#xff0c;3列。 输入…

C++从入门到起飞之——深浅拷贝string类补充 全方位剖析!

​ &#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、浅拷贝 2、深拷贝 3、现代版写法的拷贝构造和赋值重载 4、再探swap! 5、写实拷贝&#xff…

[开端]如何看待“低代码”开发平台的兴起

如何看待“低代码”开发平台的兴起&#xff1f; 近年来&#xff0c;“低代码”开发平台如雨后春笋般涌现&#xff0c;承诺让非专业人士也能快速构建应用程序。这种新兴技术正在挑战传统软件开发模式&#xff0c;引发了IT行业的广泛讨论。低代码平台是提高效率的利器&#xff0…

从零开始构建基于ChatGPT的嵌入式(Embedding)本地医疗客服问答机器人模型(看完就会,看到最后有惊喜)

1、前言 代码全部开源,GitHub地址为: github.com/aehyok/go-o… 前端完全也能搭建&#xff0c; 前端完全也能搭建&#xff0c; 前端完全也能搭建&#xff0c; 本文中我使用的是后端语言golang,来调用的所有外部接口&#xff0c;但它们均是restful api,所以如果你使用的是其他…