2013-09-02 2 views
2

Dans MongoDB J'ai une collection avec des documents ayant un tableau avec des sous-documents, je voudrais avoir un index sur:indice MongoDB performance d'écriture dégradant

{ 
    _id : ObjectId(), 
    members : [ 
     { ref : ObjectId().str, ... }, 
     { ref : ObjectId().str, ... }, 
     ... 
    ] 
} 

L'indice est sur le terrain ref, de telle sorte que je peux trouver rapidement tous les documents ayant un particulier « ref » dans ses membres:

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

je remarquai que les performances de pousser un sous-document supplémentaire au tableau se dégrade rapidement que la longueur du tableau dépasse quelques milliers. Si j'utilise plutôt un index sur un tableau de chaînes, la performance ne se dégrade pas.

Le code suivant illustre le comportement:

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(); 

Par exemple, en utilisant MongoDB 2.4.6 sur ma machine, je vois les temps suivants sont utilisés pour pousser 10 éléments sur les tableaux de longueur 5000:

  • Index sur "members.ref": 37272ms
  • index sur "memberRefs": 405ms

Cette différence semble inattendue. Est-ce un problème avec MongoDB ou mon utilisation de l'index multi-clés? Y a-t-il une manière recommandée de manipuler ceci? Merci.

Répondre

1

Jetez un oeil à SERVER-8192 et SERVER-8193. J'espère que cela aidera à répondre à votre question!

+0

[SERVER-8192] (https://jira.mongodb.org/browse/SERVER-8192) est logique, [SERVER-8193] (https://jira.mongodb.org/browse/SERVER-8193) semble lié. Merci. – Chm

Questions connexes