mysql - Json 到 mariadb 的存储大小增加了三倍
问题描述
我正在尝试将基于组织 json 文件的文件移动到 mariadb。在我的基于文件的系统中,大约有 2,000,000 个 json 文件被压缩。压缩后的 json 文件的总存储空间为 7GB。
当我将所有记录插入 Mariadb 时,表存储空间变为 35GB。我将我的表格更改为压缩表格,表格大小为 15GB。有没有办法减少更多的表大小?
向mariadb添加数据时,存储量翻倍正常吗?
这是我的桌子
CREATE TABLE `sbpi_json` (
`fileid` int(11) NOT NULL,
`json_data` longtext COLLATE utf8_bin NOT NULL,
`idhash` char(32) COLLATE utf8_bin NOT NULL,
`sbpi` int(15) NOT NULL,
`district` int(2) NOT NULL,
`index_val` int(2) NOT NULL,
`updated` text COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=COMPRESSED;
ALTER TABLE `sbpi_json`
ADD PRIMARY KEY (`fileid`),
ADD UNIQUE KEY `idhash` (`idhash`),
ADD KEY `sbpi` (`sbpi`);
解决方案
有问题的 JSON 列是json_data
,对吗?它平均(未压缩)大约 10KB,对吗?在文件实现中,每个都有多个“版本”,对吗?如果是这样,您如何确定要交付给用户的是哪一个?
- 大多数压缩技术为您提供 3:1;InnoDB 压缩为您提供 2:1。这部分是因为它有一些不能(或不会)压缩的东西。
- 仅压缩 JSON 列(在客户端代码中)并将其存储
MEDIUMBLOB
在 InnoDB 中可能比使用COMPRESSED
. (但这不会节省大量资金。) - 专注于如何选择 JSON 的哪个“版本”交付给用户。围绕它优化架构。然后决定如何存储数据。
- 鉴于该表可以有效地说明哪个文件包含所需的 JSON,那么这将是最好的方法。并使用一些正常的、快速解压缩的技术;不要专注于最大压缩。
- 如果
char(32) COLLATE utf8_bin
是十六进制字符串,请使用ascii
,而不是utf8
。 - 如果是十六进制,则
UNHEX
进一步将其缩小为仅BINARY(16)
. - 当一行大于 8KB 时,一些数据(可能
json_data
)被“不记录”存储。这意味着额外的磁盘访问和磁盘分配有点草率。因此,将该列存储为文件最终会花费大约相同的时间和空间。 - 操作系统可能会以 4KB 的块分配空间。InnoDB 使用 16KB 块。
推荐阅读
- javascript - 无限的 JavaScript 图库功能
- vb.net - 2017 VB.net 空引用异常
- docker - docker:入口点未执行
- sql-server - SSAS 多维数据集重复无法加载模型
- c# - 如何使用 Microsoft Graph API 搜索多个字符串
- ubuntu - 在 Ubuntu 上使用 Jenkins 的 casperjs.download() 不起作用
- sql - 上周、上个月和每年的总销售额 - SQL
- python - 使用beautifulsoup按类别搜索在quora网站上找不到span标签
- python - 将带注释的文本与颜色条标签文本对齐
- r - 将 xts 子集的几列设置为 NA