以Innodb引擎为例。

mysql数据逻辑上是一行一行存放的,物理上,则是以页单位存放的,页也是mysql操作的基本单位。一页大小一般是16kb。

下面看下页内具体一行数据的模型,也就是Innodb的行模式。共有四种:​​Compact​​​、​​Redundant​​​、​​Dynamic​​​和​​Compressed。​

​以Compact为例:​

【MySQL(十)】Innodb 行结构_mysql

(本篇图片全部来自掘金小册中《MySQL是怎样运行的》一书)

大致可以分为两块:数据区和必要信息;

必要信息:主要包括变长字段长度列表和null值列表,以及一些头信息。

变长字段长度列表:一些列是变长的,因为字符集可能是变长的,或者列的数据类型比如blob或者varchar这种,对于这样的数据列的值,innodb存储时肯定需要具体的数据长度,这个长度就是存在变长字段长度列表里的;

null值列表:可空列如果没有数据,innodb不会在记录里存一个null,而是将其记录在null值列表中,这个列表本质上是通过字节的bit位来代表空列的,每一个bit位对应一个可空的列,用0和1表示是否为空。

头信息:

【MySQL(十)】Innodb 行结构_mysql_02

(本篇图片全部来自掘金小册中《MySQL是怎样运行的》一书)

剩下就是真实记录部分了。真实记录处理存储各个列的值外,innodb还会分配隐藏列:rowid,trxid以及rollbackPointer。

rowid:可选,如果没有指定主键时,innodb会隐式分配一个自增主键;

trxid:最后修改该行数据的trxid;

rollbackPointer:回滚段指针;