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行格式会采用压缩算法对页进行压缩;