如何优化在MongoDB中使用大数据集的工作

我们有多个在node.js中生成的大约10,000个文档的集合(将来会越来越多),并且需要多次存储/查询/过滤/投影,我们有一个mongodb 聚合pipe道 。 一旦某些条件得到满足,文件将被重新生成并存储。

当我们有5000个文件时,一切正常。 我们将它们作为数组插入到单个文档中,并在聚合pipe道中unwind使用。 但是,在某个时候,文档不再适合单个文档,因为它超过了16 MB的文档大小限制。 我们需要将所有内容都存储起来,并添加一些标识符来知道它们属于哪个“集合”,所以我们只能在这些文档上使用pipe道。

问题:在我们可以在pipe道中查询这些文件之前写入这些文件是有问题的。 bulk.execute()部分可以很容易地花费10 – 15秒。 将它们添加到node.js中的数组中,并将<16 MB文档写入MongoDB只需要几分之一秒。

 bulk = col.initializeOrderedBulkOp(); for (var i = 0, l = docs.length; i < l; i++) { bulk.insert({ doc : docs[i], group : group.metadata }); } bulk.execute(bulkOpts, function(err, result) { // ... } 

我们如何解决大量的写入开销延迟?


思念至今:

  • 基于内存的集合临时处理数据写入磁盘时的查询。
  • 如果内存存储引擎 (警报:被认为是beta而不是生产)值得MongoDB Enterprise许可,
  • WiredTiger存储引擎可能比MMAPv1有更好的压缩和encryption性能。
  • 无论如何存储单个(数组)文件,但将其分成<16 MB大块。