正文
L + 3 bytes, where L < 2**24
LONGTEXT
L + 4 bytes, where L < 2**32
其中L表是text类型中存储的实际长度的字节数。可以计算出TEXT类型最大存储长度2**16-1 = 65535 Bytes。
Innodb数据页由以下7个部分组成:
内容
|
占用大小
|
说明
|
File Header
|
38Bytes
|
数据文件头
|
Page Header
|
56 Bytes
|
数据页头
|
Infimun 和 Supermum Records
|
|
伪记录
|
User Records
|
|
用户数据
|
Free Space
|
|
空闲空间:内部是链表结构,记录被delete后,会加入到free_lru链表
|
Page Dictionary
|
|
页数据字典:存储记录的相对位置记录,也称为Slot,内部是一个稀疏目录
|
File Trailer
|
8Bytes
|
文件尾部:为了检测页是否已经完整个的写入磁盘
|
说明:File Trailer只有一个FiL_Page_end_lsn部分,占用8字节,前4字节代表该页的checksum值,最后4字节和File Header中的FIL_PAGE_LSN,一个页是否发生了Corrupt,是通过File Trailer部分进行检测,而该部分的检测会有一定的开销,用户可以通过参数innodb_checksums开启或关闭这个页完整性的检测。
从MySQL 5.6开始默认的表存储引擎是InnoDB,它是面向ROW存储的,每个page(default page size = 16KB),存储的行记录也是有规定的,最多允许存储16K/2 - 200 = 7992行。
Innodb支持四种行格式:
由于Dynamic是Compact变异而来,结构大同而已,现在默认都是Dynamic格式;COMPRESSED主要是对表和索引数据进行压缩,一般适用于使用率低的归档,备份类的需求,主要介绍下REDUNDANT和COMPACT行格式。
这种格式为了兼容旧版本MySQL。
行记录格式:
具有以下特点:
-
存储变长列的前768 Bytes在索引记录中,剩余的存储在overflow page中,对于固定长度且超过768 Bytes会被当做变长字段存储在off-page中;
-
索引页中的每条记录包含一个6 Bytes的头部,用于链接记录用于行锁;
-
聚簇索引的记录包含用户定义的所有列。另外还有一个6字节的事务ID(DB_TRX_ID)和一个7字节长度的回滚段指针(Roll pointer)列;
-
如果创建表没有显示指定主键,每个聚簇索引行还包括一个6字节的行ID(row ID)字段;
-
每个二级索引记录包含了所有定义的主键索引列;
-
一条记录包含一个指针来指向这条记录的每个列,如果一条记录的列的总长度小于128字节,这个指针占用1个字节,否则2个字节。这个指针数组称为记录目录(record directory)。指针指向的区域是这条记录的数据部分;
-
固定长度的字符字段比如CHAR(10)通过固定长度的格式存储,尾部填充空格;
-
固定长度字段长度大于或者等于768字节将被编码成变长的字段,存储在off-page中;
-
一个SQL的NULL值存储一个字节或者两个字节在记录目录(record dirictoty)。对于变长字段null值在数据区域占0个字节。对于固定长度的字段,依然存储固定长度在数据部分,为null值保留固定长度空间允许列从null值更新为非空值而不会引起索引的分裂;
-
对varchar类型,Redundant行记录格式同样不占用任何存储空间,而CHAR类型的NULL值需要占用空间。
其中变长类型是通过长度 + 数据的方式存储,不同类型长度是从1到4个字节(L+1 到 L + 4),对于TEXT类型的值需要L Bytes存储value,同时需要2个字节存储value的长度。同时Innodb最大行长度规定为65535 Bytes,对于text类型,只保存9到12字节的指针,数据单独存在overflow page中。