当前位置: 首页 > 知识库问答 >
问题:

mysql json vs mongo-存储空间

孔茂
2023-03-14

我正在经历一个有趣的情况,虽然不是一个实际的问题,但我不能理解为什么会发生这种情况。

我们有一个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倍)。

共有1个答案

韩喜
2023-03-14

我做了一个如何在MySQL错误中使用JSON的演示(视频),其中我将堆栈溢出数据转储导入到MySQL中的JSON列中。我发现,与使用常规数据类型为每列导入相同数据到普通表和列相比,我测试的数据占用的空间要多出2倍到3倍。

JSON为相同的数据使用了更多的空间,例如,因为它将整数和日期存储为html" target="_blank">字符串,还因为它将键名存储在每一行上,而不是只在表头中存储一次。

这是比较MySQL中的JSON和MySQL中的普通列。我不知道MongoDB是如何存储数据的,为什么它要小得多。我读过MongoDB的WiredTiger引擎支持某种压缩。也许您应该在MySQL中启用压缩格式,看看这是否给您带来更好的存储效率。

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

 类似资料:
  • 我读过一些关于在存储库请求中使用空值的帖子,但它们都已经存在多年了。所以我问这个问题是为了了解问题的现状。 我想说的是: 我想要一个带有可选空值的JPA请求。我的存储库中的函数如下所示: 这样我就可以像这样省略过滤器中的参数:(@Query的一部分) 这只在我的参数不为NULL时有效。 请注意,我在这里使用的是原生查询。(JPA实现是Hibernate,DB是postgres) 提前感谢您的每一次

  • 使用laravel 7/livewire应用程序,我使用Repository制作crud,并获得了数据列表,在装载事件中,我分配了受保护的var$FacilityRepository,它在render方法中正常工作, 但在编辑方法中为空,我得到错误: 当用户单击“编辑链接”时 在模板中,编辑链接定义为: 为什么会出现错误以及如何修复? 修改#2: > 类设施扩展组件{...公共$FacilityR

  • 问题内容: 我已经看过所有类似的线程,阅读了文档,并尝试了许多组合来将空值存储在db中,并且每次都失败。 我正在使用MySQL。 我定义了一个字段。我从csv文件填充db,并且某些单元格没有值。Django文档说: 由于我正在与我一起工作,因此我希望将一个空字符串(csv中的一个空单元格)存储在db中。因此,我(认为)必须添加到该字段中。实际上,我已经尝试了更多: 每次我向数据库插入一个空字符串时

  • 希望大佬们可以科普一下,类似于百度云盘、阿里云盘这种云盘对用户空间进行限制的原理是什么,以及实现思路

  • 我要和服务人员一起建立我的preactjs网站。 使用Sw precache插件 我只是查看它存储在缓存存储中的缓存项,我期望的条目都在那里,但它们有一个空响应。 我与服务人员检查了其他一些网站,并注意到他们的条目有“OK”的响应。 只是想知道是什么触发了缓存响应说“OK”而不是空白。 我发现的另一个例子是,有些人返回OK,其他人返回空白

  • 卡桑德拉如何在内部存储空值?它是否占用任何存储空间?我正在编写一个应用程序,该应用程序使用具有许多列(100s)的表来表示不同类型的数据,因此列具有诸如“text1”,“text2”,“number1”,“number2”等名称,然后有一个外部JSON架构映射哪个列表示特定数据类型的什么值。因此,对于某种数据类型,许多列可能具有空值,并且我无法找到有关空值将占用的存储空间(如果有)的任何具体信息。