05 mysql innodb page

news2024/10/6 14:32:09

前言 

最近看到了 何登成 大佬的 "深入MySQL源码 -- Step By Step" 的 pdf 呵呵 似乎是找到了一些 方向 

之前对于 mysql 方面的东西, 更多的仅仅是简单的使用[业务中的各种增删改查], 以及一些面试题的背诵 

这里会参照 MySQL Internals Manual 来大致的看一下 innodb 里面的 page 的存储相关, 这些是深入了解 mysql 的基础 

本文内容对应的是 mysql innodb record 里面的 查看一下 rec 的数据信息, 除了 rec 之外还有那些信息呢 ? 

MySQL Internals Manual - 22.2 InnoDB Page Structure

以下截图参照自 MySQL Internals Manual  

总的来说 Page 拆分成 FileHeader, PageHeader, Infimum & Supremum, UserRecords, FreeSpace, PageDirectory, FileTrailer 

FileHeader 里面主要是包含了当前文件的相关信息, 这里面的我们需要关注的就 FIL_PAGE_OFFSET, FIL_PAGE_PREV, FIL_PAGE_NEXT 

PageHeader 里面主要包含的是当前 page 的元数据信息 

        PAGE_N_DIR_SLOTS : 当前 page pageDirectory 的数量 

        PAGE_HEAP_TOP : 当前 FreeSpace 的开始的偏移 

        PAGE_N_HEAP : 当前 page 记录的数量(UserRecords + Infimum + Supremum)

        PAGE_FREE : 当前 page 被删除的记录数量 

        PAGE_FREE : 当前 page 被删除的记录占用的字节数 

        PAGE_LAST_INSERT : 当前 page 最后一个新增的记录的偏移 

        PAGE_DIRECTION : 当前 page 最后一个新增的记录的偏移 

        PAGE_N_DIRECTION : 当前 page 最后一个新增的记录的偏移 

        PAGE_N_RECS : UserRecords 记录数量 

        PAGE_MAX_TRX_ID : 最大的 trxId 

        PAGE_LEVEL : pageLevel 

        PAGE_INDEX_ID : pageIndexId 

        PAGE_BTR_SEG_LEAF : btrSegLeaf 

        PAGE_BTR_SEG_TOP : btrSegTop 

Infimum & Supremum : Page 里面两条预制的记录 infimum 和 supremum, 分别表示 record 链表逻辑上的 head 和 tail 

UserRecords : 各个用户的记录信息, 可以参见 mysql innodb record 

FreeSpace : 当前 page 未使用的空间 

PageDirectory : key order 排序的 稀疏 record指针 列表 

FilTrailer : page 的 checksum + FileHeader 的 FIL_PAGE_LSN 后四字节 

22.2.2 Example 里面介绍了一个实例的案例, 剖析一个实际的记录在内存中的数据分布情况, 以及拆解每一个字节的逻辑意义, 可以移步文档看一下, 这里就不截图了, 请自行查阅文档 

Page 实际案例剖析 

我们这里需要着重注意的是 PageHeader 的这部分的数据信息 

        PAGE_N_DIR_SLOTS : 当前 page pageDirectory 的数量 

        PAGE_HEAP_TOP : 当前 FreeSpace 的开始的偏移 

        PAGE_N_HEAP : 当前 page 记录的数量(UserRecords + Infimum + Supremum)

        PAGE_FREE : 当前 page 被删除的记录数量 

        PAGE_FREE : 当前 page 被删除的记录占用的字节数 

        PAGE_LAST_INSERT : 当前 page 最后一个新增的记录的偏移 

        PAGE_DIRECTION : 当前 page 最后一个新增的记录的偏移 

        PAGE_N_DIRECTION : 当前 page 最后一个新增的记录的偏移 

        PAGE_N_RECS : UserRecords 记录数量 

        PAGE_MAX_TRX_ID : 最大的 trxId 

        PAGE_LEVEL : pageLevel 

        PAGE_INDEX_ID : pageIndexId 

        PAGE_BTR_SEG_LEAF : btrSegLeaf 

        PAGE_BTR_SEG_TOP : btrSegTop 

# user 对应的数据 当前页的数据信息, 拆解
(lldb) x 0x1286cc000 -c 0x120
0x1286cc000: 10 aa fb 30 00 00 00 03 ff ff ff ff ff ff ff ff  .��0....��������
0x1286cc010: 00 00 00 00 00 1a a2 7d 45 bf 00 00 00 00 00 00  ......�}E�......
0x1286cc020: 00 00 00 00 00 06 00 02 00 b9 80 04 00 00 00 00  .........�......
0x1286cc030: 00 a0 00 02 00 01 00 02 00 00 00 00 00 00 00 00  .�..............
0x1286cc040: 00 00 00 00 00 00 00 00 00 16 00 00 00 06 00 00  ................
0x1286cc050: 00 02 00 f2 00 00 00 06 00 00 00 02 00 32 01 00  ...�.........2..
0x1286cc060: 02 00 1c 69 6e 66 69 6d 75 6d 00 03 00 0b 00 00  ...infimum......
0x1286cc070: 73 75 70 72 65 6d 75 6d 05 00 00 00 10 00 21 80  supremum......!.
0x1286cc080: 00 00 01 00 00 00 00 2b 07 04 00 00 01 56 04 7b  .......+.....V.{
0x1286cc090: 80 00 00 1c 6a 65 72 72 79 04 00 00 00 18 ff d0  ....jerry.....��
0x1286cc0a0: 80 00 00 02 00 00 00 00 35 04 83 00 00 01 36 01  ........5.....6.
0x1286cc0b0: 10 80 00 00 16 6c 75 63 79 00 00 00 00 00 00 00  .....lucy.......
0x1286cc0c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x1286cc0d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x1286cc0e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x1286cc0f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x1286cc100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x1286cc110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

# page 的记录信息
0x1286cc000: 10 aa fb 30 00 00 00 03 ff ff ff ff ff ff ff ff  .��0....��������
0x1286cc010: 00 00 00 00 00 1a a2 7d 45 bf 00 00 00 00 00 00  ......�}E�......
0x1286cc020: 00 00 00 00 00 06 00 02 00 b9 80 04 00 00 00 00  .........�......
0x1286cc030: 00 a0 00 02 00 01 00 02 00 00 00 00 00 00 00 00  .�..............
0x1286cc040: 00 00 00 00 00 00 00 00 00 16 00 00 00 06 00 00  ................
0x1286cc050: 00 02 00 f2 00 00 00 06 00 00 00 02 00 32 01 00  ...�.........2..

# FIL HEADERR : 38 bytes
FIL_PAGE_SPACE = 10 aa fb 30
FIL_PAGE_OFFSET = 00 00 00 03
FIL_PAGE_PREV = ff ff ff ff
FIL_PAGE_NEXT = ff ff ff ff
FIL_PAGE_LSN = 00 00 00 00 00 1a c4 cb
FIL_PAGE_TYPE = 45 bf
FIL_PAGE_FILE_FLUSH_LSN = 00 00 00 00 00 00 00 00
FIL_PAGE_ARCH_LOG_NO = 00 00 00 06

# PAGE_HEADER : 56 byte
PAGE_N_DIR_SLOTS = 00 02
PAGE_HEAP_TOP = 00 b9
PAGE_N_HEAP = 80 04
PAGE_FREE = 00 00
PAGE_GARBAGE = 00 00
PAGE_LAST_INSERT = 00 a0
PAGE_DIRECTION = 00 02
PAGE_N_DIRECTION = 00 01
PAGE_N_RECS = 00 02
PAGE_MAX_TRX_ID = 00 00 00 00 00 00 00 00
PAGE_LEVEL = 00 00
PAGE_INDEX_ID = 00 00 00 00 00 00 00 16
PAGE_BTR_SEG_LEAF = 00 00 00 06 00 00 00 02 00 f2
PAGE_BTR_SEG_TOP = 00 00 00 06 00 00 00 02 00 32

# Page Directory & Fil Trailer, 地址不一样是因为是不同的进程里面 inspect 的, 但是不影响数据
(lldb) x 0x12663bfe0 -c 0x20
0x12663bfe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x12663bff0: 00 00 00 00 00 70 00 63 ac c3 1c c6 00 1a c4 cb  .....p.c��.�..��

PAGE_N_DIR_SLOTS = [0x0070, 0x0063]
FIL_PAGE_END_LSN = 63 ac c3 1c c6 00 1a c4 cb
CHECK_SUM = ac c3 1c c6
FIL_PAGE_LSN = 00 1a c4 cb

UserRecords 的组织 

从下面的 step2 的数据组织上来看, 我们这里的 record 列表物理上是需要 record 在 FreeSpace 里面申请 record 的空间, 但是逻辑 [以 next offset 来路由]来说 是根据 id 排序的 

jerry -> lucy -> jerry5 -> jerry7 -> jerry8 -> jerry9 

# 这里是 原有数据 jerry, lucy
# 物理上不是按照 id 进行排序的阿, 但是逻辑上来说 是按照 key order 排序的[根据 next 单链表]
# 1. 先新增了 jerry7, jerry8, jerry9
INSERT INTO `test`.`user`(`id`, `age`, `name`) VALUES (7, 22, 'jerry7');
INSERT INTO `test`.`user`(`id`, `age`, `name`) VALUES (8, 22, 'jerry8');
INSERT INTO `test`.`user`(`id`, `age`, `name`) VALUES (9, 22, 'jerry9');
# 2. 先新增了 jerry5
INSERT INTO `test`.`user`(`id`, `age`, `name`) VALUES (5, 22, 'jerry5');

# step1
(lldb) x 0x12663807f -c 0x120
0x12663807f: 80 00 00 01 00 00 00 00 2b 07 04 00 00 01 56 04  ........+.....V.
0x12663808f: 7b 80 00 00 1c 6a 65 72 72 79 04 00 00 00 18 00  {....jerry......
0x12663809f: 20 80 00 00 02 00 00 00 00 35 04 83 00 00 01 36   ........5.....6
0x1266380af: 01 10 80 00 00 16 6c 75 63 79 06 00 00 00 20 00  ......lucy.... .
0x1266380bf: 22 80 00 00 07 00 00 00 00 3d 0b 84 00 00 01 37  "........=.....7
0x1266380cf: 01 10 80 00 00 16 6a 65 72 72 79 37 06 00 00 00  ......jerry7....
0x1266380df: 28 00 22 80 00 00 08 00 00 00 00 3d 0c 85 00 00  (."........=....
0x1266380ef: 01 38 01 10 80 00 00 16 6a 65 72 72 79 38 06 00  .8......jerry8..
0x1266380ff: 00 00 30 ff 6c 80 00 00 09 00 00 00 00 3d 0d 86  ..0�l........=..
0x12663810f: 00 00 01 39 01 10 80 00 00 16 6a 65 72 72 79 39  ...9......jerry9
0x12663811f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x12663812f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x12663813f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x12663814f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x12663815f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x12663816f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x12663817f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x12663818f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
# step2
(lldb) x 0x12663807f -c 0x120
0x12663807f: 80 00 00 01 00 00 00 00 2b 07 04 00 00 01 56 04  ........+.....V.
0x12663808f: 7b 80 00 00 1c 6a 65 72 72 79 04 00 00 00 18 00  {....jerry......
0x12663809f: 86 80 00 00 02 00 00 00 00 35 04 83 00 00 01 36  .........5.....6
0x1266380af: 01 10 80 00 00 16 6c 75 63 79 06 00 00 00 20 00  ......lucy.... .
0x1266380bf: 22 80 00 00 07 00 00 00 00 3d 0b 84 00 00 01 37  "........=.....7
0x1266380cf: 01 10 80 00 00 16 6a 65 72 72 79 37 06 00 00 00  ......jerry7....
0x1266380df: 28 00 22 80 00 00 08 00 00 00 00 3d 0c 85 00 00  (."........=....
0x1266380ef: 01 38 01 10 80 00 00 16 6a 65 72 72 79 38 06 00  .8......jerry8..
0x1266380ff: 00 00 30 ff 6c 80 00 00 09 00 00 00 00 3d 0d 86  ..0�l........=..
0x12663810f: 00 00 01 39 01 10 80 00 00 16 6a 65 72 72 79 39  ...9......jerry9
0x12663811f: 06 00 00 00 38 ff 9a 80 00 00 05 00 00 00 00 3d  ....8�.........=
0x12663812f: 14 8a 00 00 01 91 01 10 80 00 00 16 6a 65 72 72  ............jerr
0x12663813f: 79 35 00 00 00 00 00 00 00 00 00 00 00 00 00 00  y5..............
0x12663814f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x12663815f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x12663816f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x12663817f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x12663818f: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

参考

MySQL Internals Manual

mysql innodb record

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

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

相关文章

06_Hudi案例实战

本文来自"黑马程序员"hudi课程 6.第六章 Hudi案例实战 6.1 案例架构 6.2 业务数据 6.2.1 消息数据格式 6.2.2 数据生成 6.3 七陌数据采集 6.3.1 Apache Flume 是什么 6.3.2 Apache Flume 运行机制 6.3.3 Apache Flume 安装部署 6.3.4 Apache Flume 入门程序 6.3.5 七…

springboot项目重启的shell命令

大家好,我是雄雄,微信公众号:雄雄的小课堂,欢迎关注。 前言 我们都知道,springboot项目启动的时候,需要如下过程: 查找 服务的进程id杀掉该进程启动服务 并且每一步都有对应的shell命令&…

torch.cat() stack()函数使用说明,含实例及运行结果

torch.cat和stack函数使用说明,含实例及运行结果 torch.cat() 函数torch.cat() 函数定义参数及功能二维数据实例解释参数dim0参数dim1参数dim-1 torch.stack() 函数torch.stack() 函数定义参数及功能二维数据实例解释参数dim0参数dim1参数dim2参数dim-1 参考博文及感…

关于Neo4j的使用及其基本命令

关于Neo4j的使用 文章目录 关于Neo4j的使用1、启动方式2、创建新节点,节点内有属性3、创建关系4、查询节点5、查询关系6、删除两个节点的关系7、删除节点8、删除某个标签的全部关系9、某个节点添加属性10、删除节点某个属性 1、启动方式 进入bin目录: …

成人自考-英语二-大纲要求及考试题型及分值详细介绍

感谢内容提供者:金牛区吴迪软件开发工作室 文章目录 一、大纲要求二、考试题型及分值1. 总览2. 样卷【2015年】(1) 阅读判断(2)阅读选择(3)概括段落大意(4)补全句子(5)填句补文(6)填词补文(7)完形补文(8)短文写作 一、大纲要求 二、考试题型及分值 1. 总览 2. 样卷…

视野狭窄--程序员的解决之道

为什么会发生这种情况? 这是我学到的最艰难的一课:辛勤工作和意图并不等同于商业影响力。我太专注于对给定问题的出色解决,而没有停下来考虑我是否在解决正确的问题。我在工程师身上投入的所有时间并没有使我们解决的问题变得更重要。你的主…

射频入门知识-混频器-1

5.4混频电路-视频_哔哩哔哩_bilibili ​​​​​​​

图·c++

数据结构: 邻接矩阵,邻接表 1.图的存储方式:邻接矩阵,邻接表 1.稀疏图和稠密图 2.无向图: n n n 个点,最多 n ( n − 1 ) / 2 n(n-1)/2 n(n−1)/2 条边, 当 m m m 接近 n ( n − 1 ) / 2 …

【面试题】1、总结面试题1

1、Java语言有哪些特点?❀ (1)【面向对象】Java是一种面向对象的语言,支持封装、继承和多态等面向对象的特性。Java特别强调类和对象的关系,要求所有代码都必须位于类中。和Java一样很流行的Python也是面向对象的语言…

NanoPi NEO移植LVGL8.3.5到1.69寸ST7789V屏幕

移植前准备 移植好fbtft屏幕驱动 参考链接:友善之臂NanoPi NEO利用fbtft驱动点亮1.69寸ST7789V2屏幕 获取源码 名称地址描述lvglhttps://github.com/lvgl/lvgl.gitlvgl-8.3.5lv_drivershttps://github.com/lvgl/lv_drivers.gitlv_drivers-6.1.1 创建工程目录 创…

项目实战 — 消息队列(8){网络通信设计①}

目录 一、自定义应用层协议 🍅 1、格式定义 🍅 2、准备工作 🎄定义请求和响应 🎄 定义BasicArguments 🎄 定义BasicReturns 🍅 2、创建参数类 🎄 交换机 🎄 队列 &#x1f38…

CSDN互利共赢玩法实战!!!

csdn项目第一波基本都顺利跑了起来,我们总计找来了一两千个新的项目源码,来让大家变现。 在实战中,主要两个玩法,一个引流,一个付费资源。付费资源门槛越来越高,所以我们这一波升级完成的号,就非…

AKStream+ZLM简单配置

下载AKStream源代码 下载AKStream源代码 git clone https://gitee.com/chatop2020/AKStreamVS2022打开AKStream,低于.net6的版本无法编译通过 打开 .sln 解决方案 如下配置AKStreamWeb 数据库配置: MySQL AKStreamWeb.json中配置 port 是MySQL的端口…

单片机第一季:零基础13——AD和DA转换

1,AD转换基本概念 51 单片机系统内部运算时用的全部是数字量,即0 和1,因此对单片机系统而言,无法直接操作模拟量,必须将模拟量转换成数字量。所谓数字量,就是用一系列0 和1 组成的二进制代码表示某个信号大…

掌握Python的X篇_33_MATLAB的替代组合NumPy+SciPy+Matplotlib

numPy 通常与 SciPy( Scientific Python )和 Matplotlib (绘图库)一起使用,这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。 文章目录 1. numpy1.1 numpy简介1.2 矩阵类型的nparra…

【设计模式】前端控制器模式

前端控制器模式(Front Controller Pattern)是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理。该处理程序可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种…

XML 数据传输格式

目录 XML简介 一、初识XML 1.什么是 XML? 2.XML 和 HTML 之间的差异 3.XML 不会做任何事情 4.通过 XML 您可以发明自己的标签 5.XML 不是对 HTML 的替代 二、XML 用途 1.XML 把数据从 HTML 分离 2.XML 简化数据共享 3.XML 简化数据传输 三、XML 树结构 1.一个 XML 文…

简单介绍C++中的模板

目录 一、泛型编程 泛型编程的概念: 泛型编程举例: 二、函数模板 函数模板的概念: 函数模板的格式: 函数模板的实例化: 隐式实例化: 显式实例化: 模板参数的匹配原则: 三、类模板 类模板的格式定义: 类模…

PyQt5组件之QLabel显示图像和视频

目录 一、显示图像和视频 1、显示图像 2、显示视频 二、QtDesigner 窗口简单介绍 三、相关函数 1、打开本地图片 2、保存图片到本地 3、打开文件夹 4、打开本地文本文件并显示 5、保存文本到本地 6、关联函数 7、图片 “.png” | “.jpn” Label 自适应显示 一、显…

C++ 之 线性插值 贝塞尔曲线 非线性动画

非线性动画在程序,游戏和动画中运用非常广泛,那么我们应该如何实现? 非线性动画上的点在s-t图像上非线性,即不为一次函数,实则为处处连续的曲线 对于此曲线可模拟,这里我们用贝塞尔曲线 一,基本…