前言

我们平时都是以记录为单位向表中插入数据的,这些记录在磁盘上的存放形式也被称为行格式。InnoDB存储引擎设计了4种行格式,分别是compact、redundant、dynamic和compressed行格式默认的行格式为dynamic。本文只介绍compact行格式,其他格式类似。

compact行格式

Compact行格式是MySQL5.0中引入的,其目标是为了更高效的存储数据记录。

mysql怎么设置类型与大小来有效的存储电话号码 mysql存储数据格式_字段


一条完整的记录其实被分为记录的额外信息和记录的真实数据两部分:

记录的额外信息

这部分信息是为了更好的管理记录而额外添加的一些信息这些信息分为三部分,变长字段长度列表、NULL值列表、记录头信息。

  • mysql中支持变长字段类型:比如varchar,变长字段中存储多少字节的数据是不固定的,所以在存储真实数据的时候,需要把这些数据占用的字节数也存储起来。也就是说变长字段占用的存储空间分为两部分:真正的数据内容、该数据占用的字节数。在compact行格式中,把所有的变长字段锁占用的字节数按逆序排放在变长字段字节数列表中。
  • NULL值列表:表中的某些列可能存储null值,如果把null值都存储到记录的真实数据中存储会很占用空间,所以compact将一条记录中值为null的列统一管理起来,存储到NULL值列表中。
    (1)如果表中的有字段允许为null,InnoDB就会开辟一块空间来标识每个字段实际存储的数据是不是NULL,如果表中的字段都不允许为NULL,则NULL值列表也就不存在了。
    (2)每个允许存储NULL的列对应一个二进制位,二进制位按照列的逆序排列,二进制位的值为1时,代表该列的值为NULL,二进制位的值为0时,代表该列的值不为NULL。
  • 记录头信息:记录头信息用于描述该记录的,它是由固定的5个字节组成,即40个二进制位,不同的位代表不同的意思。

    预留位1、2: 暂未使用
    delete_mask: 标记该记录是否被删除
    min_rec_mask: B+树的每层非叶子节点中的最小记录都会添加该标记
    n_owned: 当前记录拥有的记录数
    heap_no: 当前记录在记录堆中的位置信息
    record_type: 当前记录类型;0-普通记录,1-B+树非叶子节点记录(即所谓的目录项记录),2-最小记录,3-最大记录
    next_record: 下一条记录的相对位置

记录的数据内容

记录的真实数据除了自定义的列的数据以外,MySQL还会为每条记录默认的添加一些列(也称为隐藏列)。

mysql怎么设置类型与大小来有效的存储电话号码 mysql存储数据格式_mysql_02


当用户未指定数据表的主键时,MySQL会选择非NULL的Unique列作为主键,而如果非NULL的Unique列也没有,这个时候MySQL就会向数据表添加DB_ROW_ID字段用来作为主键。