本文共 1128 字,大约阅读时间需要 3 分钟。
InnoDB
是一个将表中数据存储到磁盘上的存储引擎,即使我们关闭并重启服务器,数据依然存在。InnoDB
存储引擎并不是一条一条的把记录从磁盘上读出,而是将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位。
InnoDB
存储引擎现在已经有4种不同类型的行格式,分别是COMPACT
、REDUNDANT
、DYNAMIC
、COMPRESSED
。 主要讲一下COMPACT
行格式: 变长字段长度列表 | NULL值列表 | 记录头信息 | 列1的值 | 列2的值 | ··· | 列3的值 |
---|
一条完整的记录可以成为记录的额外信息(变长字段长度列表,NULL
值列表,记录头列表)和记录的真实数据(列1的值,列2的值,···,列3的值)。
MySQL
支持一些变长的数据类型,比如VERCHAR(M),VARBINARY(M),各种TEXT类型,各种BLOB
类型,变长字节字段存储多少个字节的数据是不固定的,所以我们在存储真实数据的时候需要顺便把这些数据占用的字节页存起来。 在COMPACT
行格式中,所以变长字段的真实数据占用的字节数都存放在记录的开头位置,从而形成一个变长字段长度列表,各变长字段的真实数据占用字节数按着列的顺序逆序存放。 (2)NULL
值列表 一条记录的某些列可能为NULL
值,COMPACT
行格式把一条记录中为NULL值的列统一管理起来。 NULL
值的列有哪些。NULL
值的列,则NULL
值的列表也不存在了,否则将每个存储NULL
值得列对应一个二进制位,二进制位按着列的顺序逆序排列,二进制表示的意义如下: 二进制位的值为1时,代表该列的值为NULL
; 二进制位的值为0时,代表该列的值不为NULL
;MySQL
规定NULL
值必须用整数个字节的位表示,如果使用的二进制位个数不是整个字节数,则字节的高位补0;(3)记录头信息
记录头的信息由固定的5个字节组成,用于描述一些属性。 2.记录的真实数据 记录的真实数据除了我们自己定义的列的数据之外,MySQL
会为每个记录默认的添加一些列(也称隐藏列),如下: 列名 | 是否必须 | 占用空间 | 描述 |
---|---|---|---|
row_id | 否 | 6字节 | 行ID,唯一标识一条记录 |
trx_id | 是 | 6字节 | 事务ID |
roll_pointer | 是 | 7字节 | 回滚指针 |
从表中可以看出,InnoDB
存储引擎会为每条记录都添加rx_id
和roll_pointer
两个列,但是row_id
是可选的(在没有自定义主键以及不允许存储NULL
值得UNIQUE
键的情况下才会添加该列)。
转载地址:http://auhkk.baihongyu.com/