gpt4 book ai didi

mongodb - 如何快速插入到一个非常大的集合

转载 作者:可可西里 更新时间:2023-11-01 09:31:21 25 4
gpt4 key购买 nike

我收集了超过 7000 万份文档。每当我批量添加新文档(比如说 2K)时,插入操作真的很慢。我怀疑这是因为,mongo 引擎正在将所有新文档的 _id 与所有 7000 万文档进行比较,以找出任何 _id 重复条目。由于基于 _id 的索引是磁盘驻留的,它会使代码变慢。

有没有办法避免这种情况。我只想让 mongo 获取新文档并按原样插入,而不进行此检查。有可能吗?

最佳答案

诊断“缓慢”的性能

您的问题包含许多关于 MongoDB 工作原理的主要假设。我将在下面解决这些问题,但我建议您尝试根据数据库指标(即 serverStatusmongostatmongotop)、系统资源监控和MongoDB 记录慢速查询。指标需要随着时间的推移进行监控,以便您可以确定部署的“正常”情况,因此我强烈建议使用 MongoDB 特定的监控工具,例如 MMS Monitoring .

一些有趣的演示文稿为性能故障排除和调试提供了非常相关的背景 Material :

提高插入效率

除了了解您的实际性能挑战所在并调整您的部署之外,您还可以通过以下方式提高插入效率:

  • 删除此集合上任何未使用或冗余的二级索引

  • 使用 Bulk API批量插入文档

评估假设

Whenever I add new documents in batches (lets say 2K), the insert operation is really slow. I suspect that is because, the mongo engine is comparing the _id's of all the new documents with all the 70 million to find out any _id duplicate entries. Since the _id based index is disk-resident, it'll make the code a lot slow.

如果一个集合有 7000 万个条目,这并不意味着索引查找涉及 7000 万次比较。索引值存储在 B-trees 中这允许进行少量有效的比较。确切的数字将取决于树的深度、您的索引的构建方式以及您要查找的值......但将在 10 次(而不是数百万次)比较的数量级上。

如果您真的对内部结构很好奇,可以在开发环境中启用一些实验性存储和索引统计信息:Storage-viz: Storage Visualizers and Commands for MongoDB .

Since the _id based index is disk-resident, it'll make the code a lot slow.

MongoDB 加载您的 working set (最近访问的数据和索引条目的一部分)到可用内存中。

如果您能够按大致升序创建您的 ID(例如,生成的 ObjectId),那么所有更新都将发生在 B 树的右侧,并且您的工作集会小得多(常见问题解答: "Must my working set fit in RAM" ).

Yes, I can let mongo use the _id for itself, but I don't want to waste a perfectly good index for it. Moreover, even if I let mongo generate _id for itself won't it need to compare still for duplicate key errors?

MongoDB 中的所有文档都需要一个唯一的_id。默认的 ObjectId 是根据应确保唯一性的公式生成的(即返回重复键异常的可能性极低,因此您的应用程序不会出现重复键异常并且必须重试新的 _id)。

如果您对文档中的唯一 _id 有更好的候选者,请随意使用此字段(或字段集合)而不是依赖生成的 _id。请注意,_id 是不可变的,因此您不应使用任何以后可能要修改的字段。

关于mongodb - 如何快速插入到一个非常大的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24008951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com