【问题标题】:Is better to have multiple collections with thousands of documents or one collection with 100 million documents?拥有包含数千个文档的多个集合还是包含一个包含 1 亿个文档的集合更好?
【发布时间】:2019-09-26 15:10:08
【问题描述】:

我正在将具有 1 亿行的 MySql 表迁移到 MongoDB 数据库,该表存储公司的文档,它们的区别是 company_id 列。我想知道在 mongodb 上有多个集合是否会比一个集合更快,例如,每个公司都有自己的集合(集合:company_1、company_2、company_3 ...)并且只存储来自该公司的文档,所以我会不需要过滤,因为如果我只有 1 个大集合并且在每个文档中都会有一个名为 company_id 的列用于过滤文档,我需要这样做。 在这种情况下,哪种方法效果最好?

编辑: 这是一个 JSON 文档示例:https://pastebin.com/T5m2tbaY

{"_id":"5d8b8241ae0f000015006142","id_consulta":45254008,"company_id":7,"tipo_doc":"nfe","data_requisicao":"2019-09-25T15:05:35.155Z","xml":Object...

【问题讨论】:

  • 了解单个文档中包含哪些数据会很有帮助。
  • 把它们放在同一个集合和索引字段company_id.
  • @barrypicker 我将有 1 个日期字段、1 个 int 字段、1 个字段来标识什么是文档类型(nfe、nfce、cte、cteos、mdfe 或 cfe)以及另一个将存储有几十个嵌套对象的对象(这是一个转换为对象的 XML 文件),我需要在这个字段的嵌套对象中做很多过滤器
  • @barrypicker 这是一个文档示例:pastebin.com/T5m2tbaY
  • @Marcelo,感谢您提供示例数据。我没有在示例中看到 company_id。它是在不同的名称下吗? (更新 - 没关系 - 我看到 id_empresa)

标签: mongodb mongodb-php


【解决方案1】:

假设详细信息的大小不超过 16MB,您可以为每个公司创建一个集合和一个文档,并在文档中包含公司特定的详细信息。出于性能原因,在公司 ID 上放置一个索引。如果性能条件未达到预期,则纵向扩展 - 即添加内存、CPU、磁盘 IO 和网络增强功能以​​提高性能。如果这还不够,请考虑跨多个主机分片集合。

【讨论】:

  • 每个文档都存储一个大的 JSON 对象还是更好吗?请看我的编辑
  • 是的,这是避免查找的想法。所有相关数据都存储在单个文档中,并通过索引键获取。但是,您确实对文档大小有 16MB 的限制。文档架构设计很重要。一些结构比其他结构表现更好。例如,一个简单整数数组在 fetch 过程中比子文档数组执行得更好。
  • 顺便说一下,您的示例文档将近 6k。这个很小,不大。假设此示例实际上代表真实数据,则无需担心基于文档大小的性能影响。
猜你喜欢
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 2021-06-10
  • 2022-01-17
  • 2014-12-18
相关资源
最近更新 更多