You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字节

疑问

  1. 仅包含3个整数字段的表,平均行大小为何达到163字节?
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 11:49:51