MySQL学习笔记 001:InnoDB记录数据结构

1 COMPACT行格式

1.1 组成部分

  • 变长字段长度列表:记录变长数据类型的长度。
  • NULL值列表:记录值为NULL的列。
  • 记录头信息:描述记录属性(5字节)。
  • 隐藏列。
  • 列1,列2……

1.2 变长字段长度列表

注意:

  • 逆序存放
  • 不保存为NULL的列
  • 变长字符编码的固定长度字符串也需要写入

字节长度计算方法:M表示变长字段允许的字符数,W表示单字符编码的字节数,L表示实际占用字节数。
例如:VARCHAR(10),utf8mb4编码的列中保存“MYSQL”,则M为10,W为4,L为20。
首先查询表的结构,判断M*W是否大于255,小于255一律按1个字节表示长度。大于255则根据L判断,L小于127则使用1个字节表示长度,大于127则使用2个字节表示长度。

举例说明:表的结构如表头,记录如行1。字符编码均为ascii。

VARCHAR(10)CHAR(10)VARCHAR(64)VARCHAR(10)
“this is a”“this is b”“this is c, this is c, this is c, this is c.”NULL

变长长度列表为“37 09”,第四列为NULL,不做保存。第三列字符共43个,长度为43。第一列长度为9,因此长度为9。

1.3 NULL值列表

注意:

  • 逆序存放
  • 高位补0

以上表为例,假设第三列在创建表格时不允许为NULL。则NULL值列表可用一个字节表示:08,转换为二进制为0000 1000。

1.4 记录头信息

  • 预留位1:1bit。
  • 预留位2:1bit。
  • delete_flag:1bit,是否删除。
  • min_rec_flag:1bit,B+树非叶子节点最小目录项标记。
  • n_owned:4bit,组内记录数。
  • heap_no:13bit,页面堆中相对位置。
  • record_type:3bit,记录类型。
  • next_record:16bit,下一条记录相对位置。

1.5 额外隐藏列

  • row_id:行ID,当表中没有主键时自动添加,有主键时不能
  • trx_id:事务ID
  • roll_pointer:回滚指针

2 REDUNDANT行格式

2.1 组成部分

  • 字段长度偏移列表:列的偏移字节数。
  • 记录头信息:描述记录属性(6字节)。
  • 隐藏列。
  • 列1,列2。

2.2 字段长度偏移列表

仍以该例为说明:
表的结构如表头,记录如行1。字符编码均为ascii。

VARCHAR(10)CHAR(10)VARCHAR(64)VARCHAR(10)
“this is a”“this is b”“this is c, this is c, this is c, this is c.”NULL

字节长度列表为:D0 50 25 1C 13 0C 06。
计算字节长度列表时,字节的首位表示是否为NULL。

2.3 记录头信息

  • 预留位1:1bit。
  • 预留位2:1bit。
  • deleted_flag:1bit,是否删除。
  • min_rec_flag:1bit,B+树非叶子节点最小目录项标记。
  • n_owned:4bit,组内记录数。
  • heap_no:13bit,页面堆中相对位置。
  • n_field:10bit,记录中列的数量。
  • 1byte_offs_flag:1bit,字段长度偏移列表是否用1字节表示长度。
  • next_record:16bit,下一条记录相对位置。

3 溢出列

一些列占用过多存储空间时,页内只保留一部分数据合指向其他页的地址。每个页至少存放2条记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值