导图社区 InnoDB记录结构
对Mysql中 InnoDB存储引擎进行分析和总结,会有后续更新
编辑于2019-09-17 06:46:04InnoDB 记录结构
简介
InnoDB将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中的页的大小一般为16KB
行格式
Compact
记录的额外信息
变长字段长度列表
把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位,从而形成一个变长字段长度列表,各变长字段数据占用的字节数按照列的顺序逆序存放
并不是所有记录都有这个 变长字段长度列表 部分,比方说表中所有的列都不是变长的数据类型的话,这一部分就不需要有
特殊 CHAR(M) 列的存储格式
定长字符集:ascii(固定一字节)
该列占用的字节数不会被加到变长字段长度列表
变长字符集:gbk(1~2),utf8(1~3)
该列占用的字节数会被加到变长字段长度列表
NULL值列表
统计表中允许存储NULL的列
二进制位按照列的顺序逆序排列
存在列
二进制位为1时,表示该列的值为NULL
二进制位为0时,表示该列的值不为NULL
不存在列
记录头信息
由固定的5个字节组成,也就是40个二进制位
记录的真实数据
隐藏列
默认增加
DB_ROW_ID
非必须
优先使用用户自定义主键作为主键
若未定义主键,则选取一个 Unique 键做主键
若不存在 Unique键,则自动添加 DB_ROW_ID 列
在没有自定义主键以及Unique键的情况下,才会添加该列
占用6字节
行ID,唯一标识一条记录
DB_TRX_ID
必须
占用6字节
事务ID
DB_ROLL_PTR
必须
占用7字节
回滚指针
Redundant
Mysql5.0之前
Dynamic
Compressed
指定行格式语法
CREATE TABLE 表名(列的信息) ROW_FORMAT=行格式名称
ALTER TABLE 表名 ROW_FORMAT=行格式名称
行溢出数据
VARCHAR(M) 最多能储存的数据
ascii
Null
存储65532字节,真实数据的长度可能占2个字节,NULL值标识需要占1个字节
Not Null
存储65533,真实数据的长度可能占2字节
gbk
Null
gbk字符集表示一个字符最多需要2个字节,那在该字符集下,M的最大取值就是32765
Not Null
gbk字符集表示一个字符最多需要2个字节,那在该字符集下,M的最大取值就是32766 (也就是:65532/2)
utf8
Null
utf8字符集表示一个字符最多需要3个字节,那在该字符集下,M的最大取值就是21844,就是说最多能存储21843
Not Null
utf8字符集表示一个字符最多需要3个字节,那在该字符集下,M的最大取值就是21844,就是说最多能存储21844 (也就是:65532/3)个字符
一个行中的所有列(不包含隐藏列和记录头信息)占用的字节长度加起来不能超过65535个字节
记录中的数据太多产生的溢出
以页为单位,一页16K,约为16384字节
行溢出
Compact行格式
在记录的真实数据处指挥存储该列的一部分数据,然后记录的真实数据处用20个字节存储只想这些页的地址
行溢出的临界点
Mysql中规定一个页至少存放两行记录
页空间的利用
存放记录、132个字节空间的额外信息
每个记录需要的额外信息是 27 字节
2个字节用语存储真实数据的长度
1个字节用语存储列是否是NULL值
5个字节大小的头信息
6个字节的row_id列
6个字节的transaction_id列
7个字节的roll_pointer列
只要知道如果我们一条记录的某个列中存储的数据占用的字节数非常多时,该列就可能成为溢出列