之前聊了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
根据这些二进制数据,将数据按照记录头结构切分可以得到如下信息