首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InnoDB字段类型大小与文件大小下降?

问InnoDB字段类型大小与文件大小下降?
EN

Stack Overflow用户
提问于 2019-07-05 18:49:49
回答 1查看 39关注 0票数 0

我创建了这些表:

代码语言:javascript
复制
create table aca (money TINYINT);
create table acb (money SMALLINT);
create table acc (money INT);
create table acd (money BIGINT);

我一遍又一遍地运行以下插入以添加9420行:

代码语言:javascript
复制
INSERT INTO aca (money) VALUES(7), (8), (9), (10), (12);
INSERT INTO acb (money) VALUES(7), (8), (9), (10), (12);
INSERT INTO acc (money) VALUES(7), (8), (9), (10), (12);
INSERT INTO acd (money) VALUES(7), (8), (9), (10), (12);

当我检查服务器上的文件时,它会显示每个数据库比另一个稍微大一些:

代码语言:javascript
复制
-rw-r----- 1 mysql mysql 360448 Jul  5 14:21 aca.ibd
-rw-r----- 1 mysql mysql 376832 Jul  5 14:21 acb.ibd
-rw-r----- 1 mysql mysql 393216 Jul  5 14:21 acc.ibd
-rw-r----- 1 mysql mysql 442368 Jul  5 14:21 acd.ibd

由于每个字段的大小是下一个字段的两倍,所以我希望每个数据库文件的大小大约是两个大小的两倍(考虑到头部的差异很小),但情况并非如此,它们不是大一倍(大100%),而是大4%-13%。

为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-05 19:20:39

InnoDB表中包含哪些内容?下面是一个粗略的列表:

  • 因为您没有PRIMARY KEY,所以添加了一个隐藏的6字节数字。
  • 每个列前面都有一个长度和空信息。在您的情况下,这可能会增加每行两个字节。
  • 每一行都有各种各样的开销,包括事务处理等。一个估计值是每一行29个字节。
  • BTree的填充量不超过15/16。(15/16)。

同时,对于典型表定义来说,一个方便的经验法则是将明显的总列大小乘以2到3,以获得.ibd文件的大小。这不适用于您的情况,因为您有一个不切实际的小列数(1)。

只看基本的、恒定的、开销:

代码语言:javascript
复制
9420 * 16/15 * (29+6) = 351KB

这个数字与你所得到的桌子尺寸的下限非常吻合。

另一个问题:在某个时候,InnoDB占据了4/8/16 it的大块空间(“区段”)(我不确定它的大小)。我猜你还没打到呢。当这种情况发生时,计算变得更加混乱和难以理解。

可以说,InnoDB已经做了一些权衡。他们“浪费”一些空间(有时是很大的空间),使处理变得更简单和更快。

如果你有一个PRIMARY KEY,那么15/16就成问题了。如果你按PK顺序插入,那么15/16棒。但如果你随机插入,它会下降到69%左右。这是因为分块。

哦,还有“大”文本/博客栏“不记录”。ROW_FORMAT会增加皱纹。

而且,如果你用MyISAM做这件事,你会得到令人费解的尺寸,比如75360,75360,75360和94200。这些解释要简单得多,而且,如果我正确的话,它们是非常可预测的。

够困惑了吗?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56907985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档