InnoDB记录
InnoDB页介绍
InnoDB会将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16 KB。
原因:我们知道读写磁盘的速度非常慢,和内存读写差了几个数量级,如果一条一条的把记录从磁盘上读出来,速度太慢了。
InnoDB行格式
行格式分为四种:Compact、 Redundant、Dynamic 和 Compressed。
Compact格式
一条记录可以分为 额外信息 和 真实数据
额外信息分为以下三类:
- 变长字段长度列表
- 作用:对于变长的数据类型,比如 VARCHAR(M) 、各种 TEXT 类型,各种 BLOB 类型,MySQl在存储真实数据时需要知道这些数据占用了多少字节。
- 把所有变长字段的真实数据占用的字节长度都存放变长字段长度列表,各变长字段数据占用的字节数按照列的顺序逆序存放,格式为16进制。如三行数据字段name的值分别为 “aaaa” 、 “bbb” 、“d” ,它们的变长字段长度列表中的值为 01 03 04。
- NULL值列表
- 作用:表中的某些列可能存储 NULL 值,如果把这些 NULL 值都放到记录的真实数据中存储会很占地方,(需要存储一个 “NULL” 的字符串,每行都有是很占地方的)。
- 使用二进制的 0(值不为 NULL) 和 1(值为 NULL) 来表示值是否为 NULL, 二进制位按照列的顺序逆序排列,且 NULL 值列表必须用整数个字节的位表示,不足一字节时前面补 0。
- 记录头信息
- 作用:记录一些此行记录的一些信息,该记录是否被删除等等。
真实数据
记录的真实数据除了我们自己定义的列的数据以外, MySQL 会为每个记录默认的添加一些隐藏列,具体的列如下:
列名 | 是否必须 | 占用空间 | 描述 |
---|---|---|---|
row_id | 否 | 6 字节 | 行ID,唯一标识一条记录 |
transaction_id | 是 | 6 字节 | 事务ID |
roll_pointer | 是 | 7 字节 | 回滚指针 |
其中职业 row_id 不是必须的,在没有自定义主键以及Unique键的情况下才会添加该列。
char()类型字段的存储
对于 CHAR(M) 类型的列来说,当列采用的是定长字符集时,该列占用的字节数不会被加到变长字段长度列表,而如果采用变长字符集时,该列占用的字节数也会被加到变长字段长度列表。
原创文章,作者:,如若转载,请注明出处:https://blog.ytso.com/278264.html