同志们,出现了一个有趣的问题,也许有人能告诉我答案。
背景:有一个大小合适的表,大部分数据被一个 JSON 列占据。我需要以某种方式收紧空间,所以我正在做一些“研究”。
在本地扩展了约 130 万行的表片段。我们有如下表结构(InnoDB,row_format=DYNAMIC
):
a BIGINT,
b BIGINT,
c TINYINT,
d JSON NULL,
PRIMARY KEY (a,b,c)
这会占用5.8 GB磁盘空间(所有 JSON 字段均非空)。
- 如果我们加起来,
JSON_STORAGE_SIZE(d)
我们得到~3.5GB。 - 我们还可以假设所需的容量约为
a,b,c = (8+8+1)*1300000/1024/1024
20MB
“理论”和实际大小之间2GB 的差异看起来还不错。
为了实验我做了两个表:
(a,b,c)
没有 json 列的同一张表。大小48MB(i,d)
,其中 i -INT AUTO_INCREMENT
(即将密钥简化为整数) - 大小4.8 GB。
这里,这两个表的总大小比原始表小1 GB(尽管实际上INT
向数据中添加了一列)。
谁能解释一下造成这种体积差异的原因是什么?
PS:如果你有兴趣,它row_format=compressed
比原来的 5.8 -> 2.4
PS2:仅创建表。即数据已创建并上传。没有进行任何删除/更新
我有一种感觉,答案将包括有关集群、页面等的内容。但在物理存储机制方面不强。