InnoDB的行格式

InnoDB的行格式

一行数据可以以不同的格式存在InnoDB中,行格式分别有:Compact,Redundant,Dynamic和Compressed行格式;

我们可以在创建或者修改表的语句中指定行格式:

create table 表名 (列的信息)ROW_FORMAT=行格式名称
alter table 表名 ROW_FORMAT = 行格式名称

Compact行格式

在这里插入图片描述
行格式中除了我们存的信息还会存储一些额外的信息;这部分信息是服务器为了描述这条记录而不得不添加的一些信息;
主要分为3类:

  • 变长字段长度列表:按照字段在表中的顺序记录变长字段(varchar)的内容的大小,占两个字节;
  • NULL标志位:按照字段在表中的顺序记录,设置一个符号代表当前字段得值是否为空,假设说如果该字段为null就用0表示,不为null就用1来表示;占一个字节;
  • 记录头信息:

行溢出数据:

create table t1 (
  a varchar(65535)
)charset = ascii row_format = compact

我想要得是我这个字段最长为65535个字节;但是运行时发现失败了

[SQL]create table demo.t1 (
  a varchar(65535)
)charset = ascii row_format = compact;
[Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

这就是因为额外信息也要占用一定的大小,而一行数据最大就是65535个字节;
所以我们在创建表的时候,要考虑一下字段的大小;

另外一个问题是:记录中的数据太多产生的溢出
一个页的默认大小一般是16kb,也就是16384字节,而一个varchar类型的列最多可以存储65535个字节,这种情况下,一页存不了一行的数据;
在Compact和redundant行格式中,对于占用存储空间非常大的列,在记录的真实数据处只会存储该列的部分数据,把剩余的数据分散存储在其他的页中,然后记录的真实数据处用20个字节存储指向这些页的地址(当然这20个字节中还包括这些分散在其他页面中的数据的占用的字节数),从而可以找到剩余数据所在的页;
Dynamic和Compressed行格式和Compact类似,但是在处理行溢出的方式上有分歧;他们不会在记录的真实数据处存储一部分数据,而是把所有的数据都存储在其他页面,只在存储真实数据处存储其他页面的地址;另外,Compressed行格式会采用压缩算法对页进行压缩;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值