J'ai une collection MongoDB, des "fonctionnalités", ayant 3 champs: nom, actif, poids.
Je triera les fonctionnalités en poids descendant: pour optimisation, je crée index pour cela: p> je peux le voir fonctionne bien quand en utilisant Cependant, lorsque je l'interroge en poids ascendant, je suppose que l'index que je viens de créer ne fonctionnera pas et je dois créer un autre index sur le poids. Ascendant.
Requête: p> lorsque j'utilise expliquer () pour montrer comment l'index fonctionnant, je trouve qu'il imprime: p> L'index signifie-t-il que la requête est optimisée par l'index? p> Généralement, dois-je créer 2 index comme ascendance sur le poids et descendre sur le poids si je vais le trier en poids croissant dans certains cas et descendre Dans d'autres cas? p> p> expliquer () code> dans la requête. p>
4 Réponses :
En supposant que vous utilisez 2.0+, la traversée inverse n'est pas plus coûteuse à mongodb, donc pour ce cas, vous n'avez pas besoin de créer des index distincts pour le tri avant / inversé. Vous pouvez confirmer en la créant en la créant et en utilisant conseil () si vous le souhaitez ( L'optimiseur mettra en cache l'index actuel pendant un certain temps, de sorte que non automatiquement l'autre index). P>
Comme vous pouvez le voir à partir de cette document , lorsque SO basé sur ce que vous avez dit, à partir des résultats Donc non, vous n'avez pas besoin de créer des index distincts. P> Expliquez () Code> Sorties
Btreecursor code>, cela signifie qu'un index a été utilisé. Lorsqu'un index est utilisé, les index sont définies pour indiquer les limites de la clé pour la numérisation dans l'index. Toutefois, si le putput a montré
basiccursor code>, il indique une opération de style de balayage de table. P>
expliquer () code>, vous pouvez voir que vous utilisez un
btree curseur code> sur l'index nommé
actif_1_weight_-1 code> et le
inverse code> signifie que vous êtes itération sur l'index dans l'ordre inverse. P>
Je sais que je suis en retard mais je voudrais ajouter un peu plus de détails. Lorsque vous utilisez Explique () et Sortie Curseur: Btrebeursor, il ne garantit pas toujours que seul l'index est utilisé pour satisfaire votre requête. Vous devez également vérifier l'option "IndexOnly" dans les résultats d'expliquer (). Si Indexonly est émis comme vrai, cela signifie que votre requête était satisfaite à l'aide de l'index uniquement et les documents de la collection n'ont pas été mentionnés du tout. Ceci s'appelle 'Query Index couvert' em> http://docs.mongodb.org/manual/ Applications / Index / Mais si les résultats d'expliquer sont le curseur: Btreecursor et Indexonly: Faux, cela signifie que, en plus de l'utilisation de l'index, la collection a également été évoquée. Dans votre cas, pour la requête: p> Mongo aurait utilisé l'index "actif": 1, "poids": -1 pour satisfaire la partie initiale de la requête IE db.features.find ({actif: true}) et aurait fait le tri sans utiliser l'index. Donc, pour savoir exactement, vous devez regarder le résultat indexnelle à l'intérieur de l'explication (). P> p>
C'est très déroutant. Dans la classe de MongoDB, il y a un exemple de voir ci-dessous. P>
Supposons que vous ayez une collection appelée tweets dont les documents contiennent des informations sur Thecreated_at Time of the Tweet et les suiveurs de l'utilisateur au moment où ils ont émis le tweet. Que pouvez-vous déduire de la sortie Explique suivante? db.tweets.find ({"user.followers_count": {$ GT: 1000}}). Trier ({"Créé_at": 1}). Limite (10) .SKIP (5000) .Explain (). { "curseur": "btrebeursor créé_at_-1 inverse", "isrultikey": faux, "N": 10, "NscanNedObjects": 46462, "NSCANNED": 46462, "NSCANNEDODOBJECTALLPLANS": 49763, "NSCANNEDALLLLAND": 49763, "scanandorder": faux, "IndexOnly": faux, "nyelds": 0, "Nchunkskips": 0, "millis": 205, "Indexbounds": { "créé à" : [ [ { "$ minième": 1 }, { "$ maxe": 1 } ] ] }, "Serveur": "localhost.localomain: 27017" } Cette requête effectue une analyse de collection. Oui La requête utilise un index pour déterminer l'ordre dans lequel retourner les documents de résultat. Oui La requête utilise un index pour déterminer quels documents correspondent. non La requête renvoie 46462 documents no p>