InnoDB记录结构

InnoDB行格式 ?

  • 我们平时是以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式 。
  • 设计InnoDB 存储引擎的作者到现在为止设计了4种不同类型的 行格式 ,分别是 Compact 、Redundant 、Dynamic 和 Compressed 行格式。

COMPACT行格式 ?


一条完整的记录其实可以被分为 记录的额外信息 和 记录的真实数据 两大部分。
记录的额外信息
这部分信息是服务器为了描述这条记录而不得不额外添加的一些信息,这些额外信息分为3类,分别是 变长字段长度列表 、 NULL值列表 和 记录头信息:

  • 变长字段长度列表:将一些变长的数据类型,比如 VARCHAR(M),VARBINARY(M),占用的字节数存起来,这些变长字段占的存储空间分为两部分:
    a. 真正的数据内容
    b. 占用的字节数
  • NULL值列表:Compact 行格式把值为 NULL 的列统一管理起来,存储到 NULL 值列表中。
  • 记录头信息:用于描述记录的记录头信息 ,它是由固定的 5 个字节组成。
    记录的真实数据
    对于 record_format_demo 表来说, 记录的真实数据 除了 c1 、 c2 、 c3 、 c4 这几个我们自己定义的列的数据以外, MySQL 会为每个记录默认的添加一些列(也称为 隐藏列 ),具体的列如下:

InnoDB 表对主键的生成策略?

  • 优先使用用户自定义主键作为主键,如果用户没有定义主键,则选取一个 Unique 键作为主键,如果表中连 Unique 键都没有定义的话,则 InnoDB 会为表默认添加一个名为row_id 的隐藏列作为主键。
  • InnoDB存储引擎会为每条记录都添加 transaction_idroll_pointer 这两个列,但是 row_id 是可选的(在没有自定义主键以及Unique键的情况下才会添加该列)。这些隐藏列的值不用我们操心, InnoDB 存储引擎会自己帮我们生成的。