mysql json 与 mongo - 存储 space

mysql json vs mongo - storage space

我遇到了一个有趣的情况,虽然这不是实际问题,但我不明白为什么会这样。

我们有一个 mongo 数据库,主要由存储在数组中的一些批量数据组成。由于超过 90% 的团队成员熟悉 mysql,而我们中只有少数人熟悉 mongo,再加上它不是关键数据库,所有查询都已完成2 个字段(客户或产品)我们决定将数据移动到 mysql 中,像这样 table

[idProduct (bigint unsigned), idClient (bigint unsigned), data (json)]

其中数据是一个巨大的 json,包含数百个属性及其值。

我们还通过 idClient 的散列划分为 100 个分区。

PARTITION BY HASH(idClient)
PARTITIONS 100;

一切正常,但我注意到一个有趣的事实:

原始 mongo 数据库有大约 70 GB,给或拿。 mysql 版本(包含的数据实际上更少,因为我们在 mongo 中删除了一些我们用作索引的重复项)有超过 400 GB。

为什么要花这么多 space?理论上 bson 实际上应该比 json 稍微大一点(至少在大多数情况下是这样)。即使 mysql 中的索引更大...差异很大(超过 5 倍)。

我做了一个演示 How to Use JSON in MySQL Wrong (video),其中我将 Stack Overflow 数据转储导入 MySQL 中的 JSON 列。我发现我测试的数据比将相同数据导入普通 table 和每列使用常规数据类型的列多 2 到 3 倍 space。

JSON 对相同数据使用更多 space,例如因为它将整数和日期存储为字符串,还因为它在每一行上存储键名称,而不是仅在行中存储一次table header.

这是比较 MySQL 中的 JSON 与 MySQL 中的普通列。我不确定 MongoDB 如何存储数据以及为什么它这么小。我读过 MongoDB 的 WiredTiger 引擎支持压缩选项,snappy compression is enabled by default since MongoDB 3.0. Maybe you should enable compressed format in MySQL 看看这是否能提高存储效率。

MySQL 中的

JSON 像 TEXT/BLOB 数据一样存储,因为它被映射到一组 16KB 的页面中。一次为前 32 页(即最多 512KB)分配一个页面。如果内容长于此,则以 64 页 (1MB) 为增量进行进一步分配。因此,如果单个 TEXT/BLOB/JSON 内容为 513KB,则可能会分配 1.5MB。

嗨,我认为主要原因可能是由于 Mongo 内部将 json 存储为 bson ( http://bsonspec.org/ ) 并且在规范中强调这种表示是轻巧。

MongoDB 中的 WiredTiger 存储引擎默认使用 compression。我不知道 MySQL.

的默认行为

与MySQL不同,MongoDB是为了存储JSON/BSON而设计的,实际上它不存储任何其他东西。因此,这种“竞争”对于 MySQL 可能有点不公平,它像 TEXT/BLOB 数据一样存储 JSON。

如果您有关系数据,即基于列的值,那么很可能 MySQL 会更小,如 @Bill Karwin 所述。但是,在 MongoDB 中使用智能 bucketing,您可以显着减少数据大小。