12
votes

Optimisation de l'indice de MongoDB (inverse)

J'ai une collection MongoDB, des "fonctionnalités", ayant 3 champs: nom, actif, poids. Je triera les fonctionnalités en poids descendant: xxx

pour optimisation, je crée index pour cela: xxx

je peux le voir fonctionne bien quand en utilisant expliquer () dans la requête.

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: xxx

lorsque j'utilise expliquer () pour montrer comment l'index fonctionnant, je trouve qu'il imprime: xxx

L'index signifie-t-il que la requête est optimisée par l'index?

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?


0 commentaires

4 Réponses :


1
votes

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).


0 commentaires

9
votes

Comme vous pouvez le voir à partir de cette document , lorsque Expliquez () Sorties Btreecursor , 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 , il indique une opération de style de balayage de table.

SO basé sur ce que vous avez dit, à partir des résultats expliquer () , vous pouvez voir que vous utilisez un btree curseur sur l'index nommé actif_1_weight_-1 et le inverse signifie que vous êtes itération sur l'index dans l'ordre inverse.

Donc non, vous n'avez pas besoin de créer des index distincts.


0 commentaires

13
votes

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' 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: xxx

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


0 commentaires

3
votes

C'est très déroutant. Dans la classe de MongoDB, il y a un exemple de voir ci-dessous.

AVIS L'inverse Btreecursor est utilisé uniquement dans le but de trier dans la commande de saut et de limite

pas dans le but de localiser l'enregistrement.

La leçon est si NSCAN = 40K et N = 10 signifie l'indice BTRee n'est pas utilisé dans l'enregistrement de localisation.

alors quand vous voyez que l'index btreecursor ne nécessite pas d'index moyen, invité à localiser le Reocrd.

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


0 commentaires