InnoDB行格式

InnoDB中磁盘和内存的交互基本单位是页,页的大小一般为16KB,也就是在一般情况下,一次最少从磁盘中读取16KB的内容到内存中,一次最少把16KB的内容刷新到磁盘中。

COMPACT行格式

image

记录的额外信息

这部分信息是服务器为了更好的管理记录而添加的一些信息,分为三个部分,分别是边长字段长度列表、NULL值列表、记录头信息。

变长字段长度列表

MySQL中支持一些变长数据类型,比如VERCHAR(M),变长字段中存储多少字节数据是不固定的,所以我们在存储时需要顺便把这些数据占用的字节数页存起来,也就是说边长字段的存储分为两部分

  • 真正的数据内容
  • 该数据占用的字节数

边长字段真实数据所占用的字节数都存储在记录开头位置,从而形成一个边长字段长度列表。各边长字段的真实数据占用的字节数按照顺序逆序存放。


在存放过程中,有的数据占用的字节数比较少,用一个字节就可以标识,但有的数据占用的字节数比较多,可能需要两个表示,至于是一个还是两个表示,遵循一下规则。
如果该变长字段允许存储的最大字节数(M*W)超过255字节,并且真实数据占用的字节数(L)超过127字节,则使用2字节表示真实数据占用的字节数,否则使用1字节。

  • W 某字符集最多需要W个字节表示一个字符
  • M 定义中最多可以存储多少个字符
  • L 真实数据占用的字节数

值得注意的是,如果某个边长字段存储的真实数据为NULL那么边长字段长度列表不存储该字段的内容长度

NULL值列表

一条记录中可能有的列为NULL值,如果把这些NULL值都存放到记录的真实数据中会占用很多地方,所以在NULL值列表中统一存储管理,处理过程如下。

  1. 统计表中允许存放NULL的列有哪些
  2. 如果没有允许NULL的列,那么NULL就不存在,否在按照允许顺序对应成二进制位,二进制位按照顺序逆序排序,二进制位表示意义如下
    • 二进制位的值为1时,表示该列的值为NULL
    • 二进制位的值为0时,表示该列的数据不为NULL

记录头信息

image
image

真实数据

记录中的真实数据除了自己定义的数据外MySQL还会为每个行记录默认添加一些隐藏列,DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR。

  • DB_ROW_ID 行ID,唯一标识一条记录,没有主键是的默认主键,有主键时则没有
  • DB_TRX_ID 事务ID
  • DB_ROLL_PTR 回滚指针

溢出列

当一列中的数据非常多时,则需要溢出页存储多余数据,真实数据地方会有20个字节,用来存储指向这些页的地址和分散在其他页中的数据所占用的字节数

posted on 2024-02-29 14:36  死道友_不死贫道  阅读(1)  评论(0)    收藏  举报

导航