拥有数千个文档的多个集合与拥有1亿个文档的单个集合哪个更好?

3
我正在将一个拥有一亿行数据的MySQL表迁移到MongoDB数据库,该表存储公司文件,而区分它们的是列company_id。我想知道在MongoDB上有多个集合是否比只有一个集合更快,例如,每个公司都有自己的集合(集合:company_1、company_2、company_3...),并且只存储该公司的文档,这样我就不需要像在只有一个大集合中那样过滤它们,在每个文档中都会有一个名为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...

了解单个文档中包含哪些数据将会很有帮助。 - barrypicker
将它们放入同一集合并索引字段 company_id - Sergio Tulentsev
@barrypicker 我会有1个日期字段,1个int字段,1个字段用于标识文档类型(nfe、nfce、cte、cteos、mdfe或cfe),以及另一个字段,其中将存储一个具有数十个嵌套对象的对象(这是一个XML文件转换为对象),我需要在此字段的嵌套对象中进行大量过滤。 - Fantasmic
@barrypicker 这是一个文件的示例:https://pastebin.com/T5m2tbaY - Fantasmic
@Marcelo,感谢您提供示例数据。我在示例中没有看到company_id。它是用不同的名称表示吗?(更新-没关系-我看到id_empresa了) - barrypicker
哦,抱歉,我忘记将它改为英文了。 - Fantasmic
1个回答

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

即使每个文档都存储一个大的JSON对象,这样做仍然更好吗?请查看我的编辑。 - Fantasmic
1
是的,这就是我们的想法,避免查找。所有相关数据都存储在单个文档中,并通过索引键获取。但是,文档大小有16MB的限制。文档模式设计很重要。某些结构比其他结构表现更好。例如,一组简单整数的数组在提取期间的表现比子文档的数组更好。 - barrypicker
1
顺便说一下,你的示例文档几乎有6k大小。这很小,不算大。假设这个示例实际上代表了真实数据,那么文档大小对性能影响没有任何问题。 - barrypicker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接