05 mysql innodb page
前言
最近看到了 何登成 大佬的 "深入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
相关文章:
05 mysql innodb page
前言 最近看到了 何登成 大佬的 "深入MySQL源码 -- Step By Step" 的 pdf 呵呵 似乎是找到了一些 方向 之前对于 mysql 方面的东西, 更多的仅仅是简单的使用[业务中的各种增删改查], 以及一些面试题的背诵 这里会参照 MySQL Internals Manual 来大致的看一下 i…...
记录一次electron打包提示文件找不到的解决方法
没有配置files选项 files的作用是配置打包到应用程序的构建资源 就是说如果你想使用项目那个目录下的文件 就得通过files配置一下不然就会报错 json文件或者yml文件会报的错 格式是这样的 "files": ["dist-electron", "dist"],electron打包配…...
《大型网站技术架构》第二篇 架构-高可用
高可用在公司中的重要性 对公司而言,可用性关系网站的生死存亡。对个人而言,可用性关系到自己的绩效升迁。 工程师对架构做了许多优化、对代码做了很多重构,对性能、扩展性、伸缩性做了很多改善,但别人未必能直观地感受到&#…...
VS Code 使用cnpm下载包失败
一、 问题如下: 网上找到的解决方法是要在powershell中执行: Set-ExecutionPolicy RemoteSigned进行更改策略。 首先我们解释下这个Set-ExecutionPolicy RemoteSigned,Set-ExecutionPolicy 是一个 PowerShell 命令,用于控制脚本…...
【图像分类】CNN + Transformer 结合系列.4
介绍两篇利用Transformer做图像分类的论文:CoAtNet(NeurIPS2021),ConvMixer(ICLR2022)。CoAtNet结合CNN和Transformer的优点进行改进,ConvMixer则patch的角度来说明划分patch有助于分类。 CoAtN…...
分享一下利用Vue表单处理实现复杂表单布局
在开发Web应用程序中,表单是非常常见的一种元素。而在某些情况下,我们需要实现一些更为复杂的表单布局,以满足业务需求。使用Vue.js作为前端框架,我们可以很方便地处理复杂表单布局,并且实现数据的双向绑定。 下面来将…...
SAP Fiori 问题收集
事务代码篇 启动工作台:/N/UI2/FLP 错误日志: /n/IWFND/ERROR_LOG 服务清单: /n/IWFND/MAINT_SERVICE 创建语义对象:/N/UI2/SEMOBJ 创建目录:/N/UI2/FLPD_CONF(cross-client)或 /N/UI2…...
econml双机器学习实现连续干预和预测
连续干预 在这个示例中,我们使用LinearDML模型,使用随机森林回归模型来估计因果效应。我们首先模拟数据,然后模型,并使用方法来effect创建不同干预值下的效应(Conditional Average Treatment Effect,CATE&…...
《甲午》观后感——GPT-3.5所写
《甲午》是一部令人深思的纪录片,通过生动的画面和真实的故事,向观众展示了中国历史上的一段重要时期。观看这部纪录片,我深受触动,对历史的认识也得到了深化。 首先,这部纪录片通过精心搜集的历史资料和珍贵的影像资料…...
Java技术整理(6)—— 微服务篇
1、服务注册发现 服务注册就是维护一个服务列表,它在管理系统内所有的服务地址,当新的服务启动后,它会向服务列表提交自己的服务地址,服务的调用法可以直接向服务列表发送服务列表获取请求,就能获得所有的服务地址&am…...
途乐证券-新股行情持续火爆,哪些因素影响首日表现?
全面注册制以来,参加打新的投资者数量全体呈现下降。打新收益下降,破发频出的布景下,投资者打新策略从逢新必打逐步向优选个股改变。 经过很多历史数据,从商场定价、参加者热度以及机构重视度维度揭秘了上市后股价体现优秀的个股具…...
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄ÿ…...
基于weka手工实现KNN
一、KNN模型 K最近邻(K-Nearest Neighbors,简称KNN)算法是一种常用的基于实例的监督学习算法。它可以用于分类和回归问题,并且是一种非常直观和简单的机器学习算法。 KNN算法的基本思想是:对于一个新的样本数据&…...
Lua 闭包
一、Lua 中的函数 Lua 中的函数是第一类值。意味着和其他的常见类型的值(例如数值和字符串)具有同等权限。 举个例子,函数也可以像其他类型一样存储起来,然后调用 -- 将 a.p 指向 print 函数 a { p print } -- 使用 a.p 函数…...
Java技术整理(1)—— JVM篇
1、什么是JVM? JVM是一个可运行Java代码的虚拟计算机,包括一套字节码指令集,一组寄存器,一个栈,一个垃圾回收,堆和一个存储方式栈。JVM 是运行在操作系统之上,并不与操作系统直接交互。 2、运行…...
bug解决:AssertionError: No inf checks were recorded for this optimizer.
这真的是最恶心的一个error(比网络回传找哪层没有传播到还要恶心!),找了好久的问题所在之处,最后偶然发现了这篇文章: 解决pytorch半精度amp训练nan问题 - 知乎 然后发现自己用的混合精度训练,发…...
Django笔记之数据库查询优化汇总
1、性能方面 1. connection.queries 前面我们介绍过 connection.queries 的用法,比如我们执行了一条查询之后,可以通过下面的方式查到我们刚刚的语句和耗时 >>> from django.db import connection >>> connection.queries [{sql: S…...
JVM内存区域
预备 为了更好的理解类加载和垃圾回收,先要了解一下JVM的内存区域(如果没有特殊说明,都是针对的是 HotSpot 虚拟机。)。 Java 源代码文件经过编译器编译后生成字节码文件,然后交给 JVM 的类加载器,加载完…...
某行业CTF一道流量分析题
今晚看了一道题,记录学习下。 给了一个hacktrace.pcapng,分析主要内容如下: 上传两个文件,一个mouse.m2s,一个mimi.zip,将其导出。 mimi.zip中存放着secret.zip和key.pcapng 不过解压需要密码ÿ…...
【Kafka】1.Kafka简介及安装
目 录 1. Kafka的简介1.1 使用场景1.2 基本概念 2. Kafka的安装2.1 下载Kafka的压缩包2.2 解压Kafka的压缩包2.3 启动Kafka服务 1. Kafka的简介 Kafka 是一个分布式、支持分区(partition)、多副本(replica)、基于 zookeeper 协调…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
