InnoDB引擎下一行记录的结构简单总结(ASCII字符集)

四种格式下的信息表如下:

Redundant字段长度偏移列表,记录头信息(5.0以前的格式)
Compact变长字段长度列表,NULL值列表,记录头信息
Dynamic变长字段长度列表,NULL值列表,记录头信息(5.7的默认格式)
Compressed变长字段长度列表,NULL值列表,记录头信息

一、记录一行数据中额外的数据

1.1、变长字段长度列表:

  • 如果变长字段占据的最大字节数小于等于255,直接用一个字节存储数据。

  • 如果变长字段占据的最大字节数大于255:

    • 如果实际占据的字节数小于等于127,使用一个字节存储数据。
    • 如果实际占据的字节数大于127,则使用两个字节存储数据。

对于 CHAR(M) 类型的列来说,当列采用的是定长字符集(如:ASCII字符集)时,该列占用的字节数不会被加到变长字段长度列表,而如果采用变长字符集(如:gbk,utf8)时,该列占用的字节数也会被加到变长字段长度列表。

1.2、字段长度偏移列表:

  • 存储所有列的长度信息,包括隐藏列,也是与列字段相反的逆序存储。

  • 直接存储的是偏移量,通过两个偏移量之间的差值来计算占用长度,存储偏移量使用一个字节或者两个字节,并在记录头信息中的1byte_offs_flag记录,留作解析偏移量时判断使用的是一个字节存储还是两个字节存储。

    • 一个字节:如果整条记录的真实记录数据小于127字节,直接用一个字节存储。
    • 两个字节:如果整条记录的真实记录数据大于127字节则用两个字节储存,但超过32767字节时,会存储一部分数据,其余得存入溢出页,本页只保存一部分数据和溢出页的地址。

对于 CHAR(M) 类型的列来说,无论使用的字符集是否为定长字符集,最终存储的结果都为存储所需的最大字节数。

2.1、NULL值列表:

  • 允许为NULL的字段中存储的是否为NULL,0代表不是NULL,1代表是NULL。按照列顺序逆序排列。

2.2、Redundant格式的NULL值处理:

  • 定长类型的字段:直接在记录真实数据的地方使用长度为定长的0填充。
  • 变长类型的字段:不占据存储空间。

3、记录头信息:

  • 用于描述记录的其他信息。

二、记录真实数据

  • 表中可见字段,即使用者自定义的字段。

  • 表隐藏字段:

    • DB_ROW_ID(非必须):行ID,代表唯一一条记录,由InnoDB自己生成。如果使用者自定义了主键,或者可以找到Unique键作为主键的话,则不生成此隐藏列。否则以此隐藏列作为主键。
    • DB_TRX_ID:事务ID。
    • DB_ROLL_PTR:回滚指针。

三、对于溢出的处理

  • Compact和Reduntant格式:自身存储一部分数据和溢出页的地址,溢出的数据存入溢出页。
  • Dynamic格式:不会存储一部分数据,直接把溢出的所有数据存入溢出页,记录位置只存放溢出页的地址。
  • Compressed格式:与Dynamic存储方式一致,但是会采用压缩算法进行压缩,以节省空间。

一个行中的所有列(不包括隐藏列和记录头信息)占用的字节长度加起来不能超过65535个字节,不同的字符集对于一个字符对应几个字节也是不同的,所以在定义长度时要根据实际情况而定。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值