MariaDB 10.11中tinyint/smallint/integer行大小一致问题咨询
问题背景
MariaDB版本:10.11
建表语句(int1是tinyint的别名):
create table tint1 (col1 int1 unsigned not null primary key, col2 int1 unsigned not null, col3 int1 unsigned not null) ;
操作流程:
- 向
tint1表插入100行数据 - 分别使用
int2(对应smallint)、int4(对应int)数据类型创建表tint2、tint4,重复插入100行数据的操作 - 查询
information_schema查看表大小、数据长度及平均行大小,结果显示所有表的测量值完全相同,平均行大小为163字节
疑问
- 仅包含3个整数字段的表,平均行大小为何达到163字节?
- tinyint类型为何与integer类型占用的存储空间看起来相同?
问题解答
问题1:平均行大小达163字节的原因
这是**InnoDB默认页大小(16KB/16384字节)**和统计逻辑共同导致的:
- InnoDB的数据存储以页为单位,即使页内数据没有填满,整个页的空间都会被计入表的总数据长度
information_schema中的AVG_ROW_LENGTH是用「总数据长度」除以「行数」计算得出的- 当仅插入100行数据时,所有数据仅占用一个数据页,页内剩余的大量空闲空间也被算进了总数据长度,最终16384字节÷100行≈163字节,这是统计值的假象,并非每行实际占用163字节
额外补充:每个InnoDB数据页包含固定的页头(38字节)、页目录(100行约占26字节),再加上每行的固定开销(事务ID、回滚指针等约14字节)+3个tinyint字段的3字节,100行实际仅占用约2300字节,剩余的14000+字节都是页内空闲空间。
问题2:tinyint与integer存储空间看似相同的原因
同样是因为数据量过小,所有表的数据都只存放在一个InnoDB页中,information_schema统计的表大小、数据长度都是按整个页计算的,因此三者看起来占用空间一致。
实际上三种类型的字段本身占用空间有明确差异:
tinyint unsigned:1字节/字段smallint unsigned(int2):2字节/字段int unsigned(int4):4字节/字段
当插入足够多的数据(比如数十万行),数据会被分配到多个数据页,此时三者的总表大小、平均行大小会呈现明显差异:tint1表的总占用空间会远小于tint2和tint4,平均行大小也会更接近每行的实际开销(固定行开销+字段本身大小)。
内容的提问来源于stack exchange,提问作者Pgmer6809
相关产品推荐
相关产品推荐

