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

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

前言

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

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

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

在之前的文章中有搭建过分析数据表详情参考InnoDB数据页结构(1)环境搭建

表结构如下

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值