InnoDB数据页结构(2)之记录头信息解析

InnoDB数据页结构之记录头信息解析

前言

之前聊了InnoDB数据页的结构由7部分组成,如下所示

 

现在将以记录为切入点讲解,先来聊聊记录头信息,在用户记录中每条数据都包含一个记录头信息,以COMPACT行结构为例,结构图如下所示

 

记录头用于描述记录信息,一般由5个字节40位构成,结构如下

 

在之前的文章中有搭建过分析数据表详情参考

表结构如下

 CREATE TABLE page_demo (
  c1 int(11) NOT NULL,
  c2 int(11) DEFAULT NULL,
  c3 varchar(10000) DEFAULT NULL,
  PRIMARY KEY (c1)
 ) ENGINE=InnoDB DEFAULT CHARSET=ascii ROW_FORMAT=COMPACT

表数据如下

 +----+------+------+
 | c1 | c2 | c3 |
 +----+------+------+
 | 1 | 100 | aaaa |
 | 2 | 200 | bbbb |
 | 3 | 300 | cccc |
 | 4 | 400 | dddd |
 +----+------+------+

根据测试表page_demo能够得到ibd文件如下分析信息

 .......省略部分信息
 0000c050 00 02 00 f2 00 00 00 68 00 00 00 02 00 32 01 00 |.......h.....2..|
 0000c060 02 00 1c 69 6e 66 69 6d 75 6d 00 05 00 0b 00 00 |...infimum......|
 0000c070 73 75 70 72 65 6d 75 6d 04 00 00 00 10 00 20 80 |supremum...... .|
 0000c080 00 00 01 00 00 00 00 8f 4e bb 00 00 01 31 01 10 |........N....1..|
 0000c090 80 00 00 64 61 61 61 61 04 00 00 00 18 00 20 80 |...daaaa...... .|
 0000c0a0 00 00 02 00 00 00 00 8f 4e bb 00 00 01 31 01 1c |........N....1..|
 0000c0b0 80 00 00 c8 62 62 62 62 04 00 00 00 20 00 20 80 |....bbbb.... . .|
 0000c0c0 00 00 03 00 00 00 00 8f 4e bb 00 00 01 31 01 28 |........N....1.(|
 0000c0d0 80 00 01 2c 63 63 63 63 04 00 00 00 28 ff 91 80 |...,cccc....(...|
 0000c0e0 00 00 04 00 00 00 00 8f 4e bb 00 00 01 31 01 34 |........N....1.4|
 0000c0f0 80 00 01 90 64 64 64 64 00 00 00 00 00 00 00 00 |....dddd........|
 .......省略部分信息

行格式简单分析

以第一条记录为例分析,记录值如下所示

 +----+------+------+
 | c1 | c2 | c3 |
 +----+------+------+
 | 1 | 100 | aaaa |
 +----+------+------+

在ibd文件中数值表示如下所示

 

下面数值具体表示如下

 04 :变长字段长度列表,page_demo表中c3列为varchar类型字符集为ascii,所以c3列值为aaaa长度为4
 00 :NULL值列表,第一列没有NULL值所以都是0
 00 00 10 00 20 :记录头信息(固定5个字节)
 80 00 00 01 :row_id值,由于定义了c1为主键所以这里存放c1列的值1(int类型存放规则)
 00 00 00 00 8f 4e :transaction_id列的值(固定6个字节)
 bb 00 00 01 31 01 10 :roll_pointer列的值(固定7个字节)
 80 00 00 64 :c2列的值为64
 61 61 61 61 :c3列的值为aaaa

根据上面的推理很容易可以得到测试表page_demo4条记录的记录头信息如下所示

 第一列:00 00 10 00 20
 第二列:00 00 18 00 20
 第三列:00 00 20 00 20
 第四列:00 00 28 ff 91

根据记录头的构成,将上面的记录由十六进制转换为二进制分析

 第一列:00000000 00000000 00010000 00000000 00100000
 第二列:00000000 00000000 00011000 00000000 00100000
 第三列:00000000 00000000 00100000 00000000 00100000
 第四列:00000000 00000000 00101000 11111111 10010001

根据这些二进制数据,将数据按照记录头结构切分可以得到如下信息

 

 

posted on   Java面试365  阅读(55)  评论(0编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示