我正在经历一个有趣的情况,虽然不是一个实际的问题,但我不能理解为什么会发生这种情况。
我们有一个mongo数据库,主要由存储在数组中的大量数据组成。由于团队中90%以上的人熟悉mysql,而我们中只有少数人熟悉mongo,再加上mysql不是一个关键的db,所有查询都是在两个字段(客户端或产品)上完成的,我们决定将mysql中的数据移动到如下表中
[idProduct(bigint unsigned),idClient(bigint unsigned),data(json)]
其中数据是包含数百个属性及其值的巨大json。
我们还通过IDClient上的散列对100个分区进行了分区。
PARTITION BY HASH(idClient)
PARTITIONS 100;
一切正常,但我注意到一个有趣的事实:
最初的mongo db大约有70 GB左右。mysql版本(实际上包含更少的数据,因为re删除了一些我们在mongo中用作索引的重复数据)有400多GB。
为什么要占用这么多空间?理论上,bson实际上应该略大于json(至少在大多数情况下)。即使MySQL中的索引较大...差别是巨大的(超过5倍)。
我做了一个如何在MySQL错误中使用JSON的演示(视频),其中我将堆栈溢出数据转储导入到MySQL中的JSON列中。我发现,与使用常规数据类型为每列导入相同数据到普通表和列相比,我测试的数据占用的空间要多出2倍到3倍。
JSON为相同的数据使用了更多的空间,例如,因为它将整数和日期存储为字符串,还因为它将键名存储在每一行上,而不是只在表头中存储一次。
这是比较MySQL中的JSON和MySQL中的普通列。我不知道MongoDB是如何存储数据的,为什么它要小得多。我读过MongoDB的WiredTiger引擎支持某种压缩。也许您应该在MySQL中启用压缩格式,看看这是否给您带来更好的存储效率。
MySQL中的JSON像text/blob数据一样存储,因为它被映射到一组16KB的页面中。对于前32个页面(即最多512KB),一次分配一个页面。如果内容长于此,则以64页(1MB)为增量进行进一步分配。因此,如果单个text/blob/json内容是513KB,那么它可能会分配1.5MB。