MongoDB中用于大型集合的批量插入性能

时间:2015-06-09 15:19:07

标签: performance mongodb insert mongodb-java

我正在使用BulkWriteOperation(java驱动程序)以大块存储数据。起初它看起来工作正常,但是当集合的大小增加时,插入可能需要花费很多时间。

目前,对于20M文档的集合,1000个文档的批量插入可能需要大约10秒钟。

有没有办法让插件独立于集合大小? 我没有任何更新或upsert,它总是我插入的新数据。

从日志来看,锁似乎没有任何问题。 每个文档都有一个被索引的时间字段,但是它呈线性增长,因此我认为没有必要让mongo花时间重新组织索引。

我希望听到一些提高性能的想法

谢谢

3 个答案:

答案 0 :(得分:4)

您认为索引不需要任何document reorganisation,并且您描述索引的方式表明right handed index是可以的。因此,索引似乎被排除在外。你当然可以 - 如上所述 - 通过删除索引并重新运行批量写入来明确地排除这一点。

除了索引,我还是......

  • 考虑您的磁盘是否能够跟上您持久存储的数据量。有关详情,请参阅Mongo docs
  • 使用profiling了解您的写作内容正在发生什么

答案 1 :(得分:3)

  1. 您的收藏中是否有任何索引? 如果是,则需要时间来构建索引树。
  2. 是数据时间序列? 如果是,则使用更新而不是插入。请阅读此博客。该博客建议就地更新比插入(https://www.mongodb.com/blog/post/schema-design-for-time-series-data-in-mongodb
  3. 更有效
  4. 您是否有能力设置分片集合? 如果是的话,它会减少时间(在具有1500万个ip地理入口记录的3个分片服务器中进行测试)

答案 2 :(得分:1)

  • 磁盘利用率& CPU:检查磁盘利用率和CPU,看看是否有最大值。 显然,它应该是导致此问题的磁盘。

  • Mongo日志: 此外,如果1000个批量查询占用10秒,则检查mongo日志是否在1000个批量中有任何花费时间的插入。如果有任何此类查询,那么您可以缩小分析范围

另一件不清楚的事情是Mongo实例上发生的查询顺序。是插入发生的唯一操作还是还有其他查找运行的查询?如果是,那么你应该考虑扩大任何资源的最大限度。