mysql innodb引擎下的页格式和行格式

页格式

页格式
页格式说明

行格式

innodb总共有4种行格式:Compact、Redundant、Dynamic和Compressed行格式

在创建或修改表的语句中指定行格式:

CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称 
ALTER TABLE 表名 ROW_FORMAT=行格式名称
Compact行格式

Compact行格式

变长字段长度列表(2个字节)

VARCHAR(M)、VARBINARY(M)、TEXT类型,BLOB类型,这些数据类型修饰的列称为变长字段,变长字段中存储多少字节的数据不是固定的,所以我们在存储真实数据的时候需要顺便把这些数据占用的字节数也存起来,如果表中没有变长字段,则该列表也不存在了(在更新一条sql的时候,若变长字段的长度没有变,则直接修改字段的值,否则,先删除原来的那一条sql,再插入新的sql)

NULL值列表(1个字节)

Compact行格式会把可以为NULL的列统一管理起来,存一个标记为在NULL值列表中,如果表中没有允许存储 NULL 的列,则 NULL值列表也不存在了。(1代表该列的值为null,0不为null)

记录头信息(5个字节)

记录头

记录的真实数据

记录的真实数据除了我们自己定义的列的数据以外,还会有三个隐藏列:
隐藏列

实际上这几个列的真正名称其实是:DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR

一个表没有手动定义主键,则会选取一个Unique键作为主键,如果连Unique键都没有定义的话,则会为表默认添加一个名为row_id的隐藏列作为主键。所以row_id是在没有自定义主键以及Unique键的情况下才会存在的

页大小与行大小

每一页固定大小为16KB,也就是16384字节。每一行的最大长度为65535B(除BLOB或者TEXT类型的列之外, 其他所有的列(不包括隐藏列和记录头信息)占用的字节长度加起来不能超过65535个字节)

记录中的数据太多,产生溢出

由于一个页和一行的最大容量有差距,所以有可能出现一个页存放不了一条记录的情况。

在Compact和Reduntant行格式中,对于占用存储空间非常大的列,在记录的真实数据处只会存储该列的一部分 数据,把剩余的数据分散存储在几个其他的页中,然后记录的真实数据处用20个字节存储指向这些页的地址(当 然这20个字节中还包括这些分散在其他页面中的数据的占用的字节数),从而可以找到剩余数据所在的页。

Dynamic和Compressed行格式中,不会在记录的真实数据处 存储一部分数据,而是把所有的数据都存储到其他页面中,只在记录的真实数据处存储其他页面的地址。另外, Compressed行格式会采用压缩算法对页面进行压缩。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值