首页 > 解决方案 > 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`);

标签: mysqljsonmariadbstoragespace

解决方案


有问题的 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 块。

推荐阅读