Performance MongoDB多键索引写入性能下降

Performance MongoDB多键索引写入性能下降,performance,mongodb,indexing,Performance,Mongodb,Indexing,在MongoDB中,我有一个文档集合,其中包含子文档的数组,我希望有一个索引: { _id : ObjectId(), members : [ { ref : ObjectId().str, ... }, { ref : ObjectId().str, ... }, ... ] } 索引位于ref字段上,因此我可以快速找到其成员中具有特定“ref”的所有文档: db.test.ensureIndex({ "members.

在MongoDB中,我有一个文档集合,其中包含子文档的数组,我希望有一个索引:

{
    _id : ObjectId(),
    members : [
        { ref : ObjectId().str, ... },
        { ref : ObjectId().str, ... },
        ...
    ]
}
索引位于ref字段上,因此我可以快速找到其成员中具有特定“ref”的所有文档:

db.test.ensureIndex({ "members.ref" : 1 });
我注意到,当数组长度超过几千时,将附加子文档推送到数组中的性能会迅速下降。如果改为对字符串数组使用索引,则性能不会降低

以下代码演示了该行为:

var _id = ObjectId("522082310521b655d65eda0f");

function initialize () {
    db.test.drop();
    db.test.insert({ _id : _id, members : [], memberRefs : [] });
}

function pushToArrays (n) {
    var total, err, ref;

    total = Date.now();
    for (var i = 0; i < n; i++) {

        ref = ObjectId().str;
        db.test.update({ _id : _id }, { $push : { members : { ref : ref }, memberRefs : ref } });

        err = db.getLastError();
        if (err) {
            throw err;
        }

        if ((i + 1) % 1000 === 0) {
            print("pushed " + (i + 1));
        }
    }

    total = Date.now() - total;
    print("pushed " + n + " in " + total + "ms");
}

initialize();
pushToArrays(5000);

db.test.ensureIndex({ "members.ref" : 1 });
pushToArrays(10);
db.test.dropIndexes();

db.test.ensureIndex({ "memberRefs" : 1 });
pushToArrays(10);
db.test.dropIndexes();
var\u id=ObjectId(“522082310521b655d65eda0f”);
函数初始化(){
db.test.drop();
insert({u-id:{u-id,members:[],memberRefs:[]);
}
功能推送阵列(n){
var总计、误差、参考值;
总计=日期。现在();
对于(变量i=0;i
例如,在我的机器上使用MongoDB 2.4.6,我看到在长度为5000的阵列上推送10个元素的时间如下:

  • “members.ref”索引:37272ms
  • “memberRefs”上的索引:405ms
这种差异似乎出乎意料。这是MongoDB的问题还是我使用多键索引的问题?有没有推荐的处理方法?谢谢。

看一看和。希望这将有助于回答您的问题

有道理,似乎相关。谢谢