2014-09-20 4 views
-2

S'il vous plaît aidez-moi avec des index dans mongoDB.MongoDB. Comment configurer les index?

Il existe une collection dans laquelle 800 000 documents. Il y a une requête qui est très longue. Environ 5 secondes!

{ 
    "$or":[ 
     { 
     "performer":"534ba408f9cd0ecb51711673", 
     "$or":[ 
      { 
       "performersRole":"534ba30bf9cd0ec151a69522" 
      }, 
      { 
       "performersRole":{ 
        "$exists":false 
       } 
      } 
     ] 
     }, 
     { 
     "performersRole":"534ba30bf9cd0ec151a69522", 
     "notShowInToDo":{ 
      "$ne":true 
     } 
     } 
    ], 
    "taskTime":{ 
     "$gte":1409774400, 
     "$lt":1409860799 
    }, 
    "$and":[ 
     { 
     "$or":[ 
      { 
       "department":{ 
        "$in":[ 
        "5356134ef9cd0e4805672a15", 
        "53561368f9cd0e4b05645f3f", 
        "53a0357ff9cd0e670537c4b7", 
        "53a03594f9cd0e6705389449" 
        ] 
       } 
      }, 
      { 
       "department":{ 
        "$exists":false 
       } 
      } 
     ] 
     }, 
     { 
     "$or":[ 
      { 
       "salon":"534f7b3bf9cd0e311e77896f" 
      }, 
      { 
       "salon":{ 
        "$exists":false 
       } 
      } 
     ] 
     } 
    ], 
    "isDone":{ 
     "$ne":true 
    } 
} 

Quels index ajouter pour optimiser? Merci pour tout conseil!

Presque tous les documents sur ce format:

{ 
    "_id": "541da66cf535a4a8569dd0ed", 
    "title": "test task", 
    "taskTime": NumberLong(1411229292), 
    "client": "53f876b2f535a4187f9e1264", 
    "salon": "534f7c3cf9cd0e91206dd948", 
    "track": "541da66cf535a4a8569dd0ec", 
    "department": "53a0357ff9cd0e670537c4b7", 
    "type": "invitePBP", 
    "performersRole": [ 
    "534ba30bf9cd0ec151a69522" 
    ], 
    "notShowInToDo": true, 
    "@createTime": NumberLong(1411229292), 
    "@updateTime": NumberLong(1411229292) 
} 
+0

Vous feriez mieux de donner plus de détails. Par exemple, quels index avez-vous faits? quels champs ont des valeurs uniques? ... – Wizard

+0

ajouté à l'exemple de document de la question – jeka5555

+0

En plus des constructions très étranges, vous pourriez simplement [lire les docs sur l'indexation] (http://docs.mongodb.org/manual/core/indexes/). –

Répondre

0

Avant la création de l'indice, considère que les points suivants: 1.
Réduisez le nombre de hiérarchie de requête possible que vous le pouvez;
2. Évitez d'utiliser $add et $or si possible;
3. Évitez d'utiliser $exists si possible car il accèdera à la collection même si vous avez un index sur le terrain;
4. Concevez l'index en fonction de la séquence exécutée comme vous le souhaitez.

Supposons que je comprends bien vos besoins, je reconstruis la requête comme suit:

var query = { 
    "taskTime" : { 
     "$gte" : 1409774400, 
     "$lt" : 1409860799 
    }, 
    "isDone" : { 
     "$ne" : true 
    }, 
    "$and" : [ 
      { 
       "salon" : { 
        "$in" : [ null, "534f7b3bf9cd0e311e77896f" ] 
       } 
      }, { 
       "department" : { 
        "$in" : [ null, 
           "5356134ef9cd0e4805672a15", 
           "53561368f9cd0e4b05645f3f", 
           "53a0357ff9cd0e670537c4b7", 
           "53a03594f9cd0e6705389449" ] 
       } 
      }], 
    "$or" : [ { 
     "performer" : "534ba408f9cd0ecb51711673", 
     "performersRole" : { 
      "$in" : [ null, "534ba30bf9cd0ec151a69522" ] 
     } 
    }, { 
     "performersRole" : "534ba30bf9cd0ec151a69522", 
     "notShowInToDo" : { 
      "$ne" : true 
     } 
    } ] 
}; 

Méfiez-vous des null:

  • Soyez attentioned que {"salon" : {"$in" : [ null, "534f7b3bf9cd0e311e77896f" ]} peut travailler complètement sur l'indice {salon:1} en v2.4 mais toujours accéder à la collection en v2.6, je ne connais pas la raison exacte mais juste deviner que c'est possible à la définition de null a été modifié (inclure le type undefined).
  • Pour éviter ce problème dans la version 2.6, une alternative consiste à initialiser une valeur réelle au champ salon au lieu de ne rien faire.

Vous pouvez essayer de cette façon de créer un index et vos commentaires sont appréciés puisque je n'ai pas les données réelles pour faire un test.

db.c.ensureIndex({taskTime:1, isDone:1, salon:1, department:1}, {name:"bigIndex"}); 

Ajouter résultat de mon test - 1010,000 documents

var a = { 
     "taskTime" : { 
      "$gte" : 1410443932781, 
      "$lt" : 1412443932781 
     }, 
     "isDone" : { 
      "$ne" : true 
     }, 
     "$and" : [ 
       { 
        "salon" : { 
         "$in" : [ null, "534f7b3bf9cd0e311e77896f", "5420ecdc218ba2fb5353ad5b" ] 
        } 
       }, { 
        "department" : { 
         "$in" : [ null, 
            "5356134ef9cd0e4805672a15", 
            "53561368f9cd0e4b05645f3f", 
            "53a0357ff9cd0e670537c4b7", "5420ecdc218ba2fb5353ad5d", 
            "53a03594f9cd0e6705389449" ] 
        } 
       }], 
     "$or" : [ { 
      "performer" : "534ba408f9cd0ecb51711673", 
      "performersRole" : { 
       "$in" : [ null, "5420ecdc218ba2fb5353ad5e" ] 
      } 
     }, { 
      "performersRole" : "5420ecdc218ba2fb5353ad5e", 
      "notShowInToDo" : { 
       "$ne" : true 
      } 
     } ] 
    }; 

db.c.find(a).explain(); 

{ 
     "cursor" : "BtreeCursor bigIndex", 
     "isMultiKey" : false, 
     "n" : 1, 
     "nscannedObjects" : 1, 
     "nscanned" : 54290, 
     "nscannedObjectsAllPlans" : 1, 
     "nscannedAllPlans" : 54290, 
     "scanAndOrder" : false, 
     "indexOnly" : false, 
     "nYields" : 425, 
     "nChunkSkips" : 0, 
     "millis" : 261, 
     "indexBounds" : { 
       "taskTime" : [ 
         [ 
           1410443932781, 
           1412443932781 
         ] 
       ], 
       "isDone" : [ 
         [ 
           { 
             "$minElement" : 1 
           }, 
           true 
         ], 
         [ 
           true, 
           { 
             "$maxElement" : 1 
           } 
         ] 
       ], 
       "salon" : [ 
         [ 
           null, 
           null 
         ], 
         [ 
           "534f7b3bf9cd0e311e77896f", 
           "534f7b3bf9cd0e311e77896f" 
         ], 
         [ 
           "5420ecdc218ba2fb5353ad5b", 
           "5420ecdc218ba2fb5353ad5b" 
         ] 
       ], 
       "department" : [ 
         [ 
           null, 
           null 
         ], 
         [ 
           "5356134ef9cd0e4805672a15", 
           "5356134ef9cd0e4805672a15" 
         ], 
         [ 
           "53561368f9cd0e4b05645f3f", 
           "53561368f9cd0e4b05645f3f" 
         ], 
         [ 
           "53a0357ff9cd0e670537c4b7", 
           "53a0357ff9cd0e670537c4b7" 
         ], 
         [ 
           "53a03594f9cd0e6705389449", 
           "53a03594f9cd0e6705389449" 
         ], 
         [ 
           "5420ecdc218ba2fb5353ad5d", 
           "5420ecdc218ba2fb5353ad5d" 
         ] 
       ] 
     }, 
     "server" : "Mars-PC:27017", 
     "filterSet" : false 
}