InnoDB存储引擎(行结构)

InnoDB行存储的三个组成部分(说明: F字符表示列的数量)

名称(Name)   大小(Size)  
Field Start Offsets   (F*1) or (F*2) bytes  
Extra Bytes   6 bytes  
Field Contents   取决于内容  

1: FIELD START OFFSETS

指在实际数据存储行中每一字段(entry,实际存储不只是包括列,还有额外信息)的位置偏移量信息列表,这个位置由原点(Origin)相对位置和下一个字段计算而来。该列表保存的行中每一字段的偏移信息为倒序的,也就是说行中第一字段信息在这个列表的最后。

举个例子:假设有三个列,第一个列的长度为1字节,第二个为2字节,第三个为4字节,这种情况下,保存三个列的偏移信息分别为[1,3(1+2),7(1+2+4)],列表倒序,转储的Field Start Offsets的信息应该为[07,03,01].

有两种的特殊复杂情况:

1:偏移量数字可能为一个或两个字节,一个字节最多允许长度为127,最高位bit用来保存是否为NULL,"Extra Bytes"部分说明了偏移量为一个字节还是两个字节。

2:偏移量可能有一个标志信息,剩下的字节空间包含两个段,指具体的内容。(可能这些内容并不在同一个页中,参考后面的分析)

当偏移量为一个字节时:

1 bit = NULL

7 bit, 实际的偏移信息

当偏移量为两个字节时:

1 bit = NULL

1 bit = 0 内容在同一个页中,= 1 内容在不同的页中

14 bits = 实际的偏移量,0 ~ 16383

2:EXTRA BYTES

Extra Bytes为6个字节

Name   Size   Description  
info_bits:   ??   ??  
()   1 bit   未使用  
()   1 bit   未使用  
deleted_flag   1 bit   1:删除标志位(已删除)  
min_rec_flag   1 bit   1: 预定义的最小记录  
n_owned   4 bits   拥有的记录数量  
heap_no   13 bits   堆块中索引的数据页序列编号  
n_fields   10 bits   记录中的字段数量 1 to 1023  
1byte_offs_flag   1 bit   1:Field Start Offsets为一个字节,否则为两个字节  
next 16 bits   16 bits   下一个记录的指针(System Column #1)  
TOTAL   48 bits   ??  

共48 bit,6个字节

如果需要通过字节读取这存储的记录,最关键的需要读取Extra Bytes 中的byte_offs_flag位信息,需要知道1表示偏移信息为一个字节,0表示两个字节

如果给定了一个相对原点(Origin),InnoDB获取记录开始遵循如下步骤:

-- X = n_fields,这个数字等于Field Start Offsets列表中的定义的数量

-- 如果byte_offs_flag = 0,X = X * 2,每个偏移量为两个字节表示的

-- X = X + 6,固定大小的Extra Bytes为6字节

-- 记录的开始位置当前的位置减去X

(参照FIELD CONTENTS)

3:FIELD CONTENTS

Field Contents部分包括了记录的所有数据,这些字段按照我们预定义的方式按顺序存储。

字段与字段没有任何标记,记录的结尾也没有任何标志。

实例:

-- 创建一张表
CREATE TABLE T
    (FIELD1 VARCHAR(3), FIELD2 VARCHAR(3), FIELD3 VARCHAR(3))
    Type=InnoDB;

需要知道的是,InnoDB下表中的每一行有6个字段,并不是3个,因为InnoDB在存储的内容前自动补充的3个列("system columns"),这些列分别为 行ID(row ID,该表未定义主键),事务ID(transaction ID), 回滚指针(rollback pointer)。

-- 为该表增加三条数据
INSERT INTO T VALUES ('PP', 'PP', 'PP');
INSERT INTO T VALUES ('Q', 'Q', 'Q');
INSERT INTO T VALUES ('R', NULL, NULL);

运行工具(Borland's TDUMP)查看二进制的事务文件信息(\MySQL\data\ibdata1)

Address Values in Hexadecimal

 

Values in ASCII

 

0D4280: 00 00 2D 00 84 4F 4F 4F 4F 4F 4F 4F 4F 4F 19 17

 

..-..OOOOOOOOO..

 

0D4290: 15 13 0C 06 00 00 78 0D 02 BF 00 00 00 00 04 21

 

......x........!

 

0D42A0: 00 00 00 00 09 2A 80 00 00 00 2D 00 84 50 50 50

 

.....*....-..PPP

 

0D42B0: 50 50 50 16 15 14 13 0C 06 00 00 80 0D 02 E1 00

 

PPP.............

 

0D42C0: 00 00 00 04 22 00 00 00 00 09 2B 80 00 00 00 2D

 

....".....+....-

 

0D42D0: 00 84 51 51 51 94 94 14 13 0C 06 00 00 88 0D 00

 

..QQQ...........

 

0D42E0: 74 00 00 00 00 04 23 00 00 00 00 09 2C 80 00 00

 

t.....#.....,...

 

0D42F0: 00 2D 00 84 52 00 00 00 00 00 00 00 00 00 00 00

 

.-..R........... 

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5e7b109decad5df866a5c15a1570070c.html