134 votes

pourquoi la direction de l'indice est-elle importante dans MongoDB?

Pour citer les docs:

Lors de la création d'un index, le nombre associé à une clé spécifie le la direction de l'index, et donc il doit toujours être de 1 (croissant) ou -1 (décroissant). La Direction n'a pas d'importance pour un seul index de clés ou pour d'accès aléatoire de récupération, mais il est important si vous faites des tris ou des la gamme des requêtes sur l'index composés.

Cependant, je ne vois pas pourquoi la direction de l'index qui doit compter sur l'index composés - quelqu'un peut-veuillez fournir une explication supplémentaire (ou un exemple)?

130voto

Jared Kells Points 1604

MongoDB est une concaténation de la clé composée, d'une certaine façon, et qu'il utilise comme clé dans un Arbre.

Lors de la recherche d'objets à l'unité - L'ordre des nœuds dans l'arbre n'est pas pertinent.

Si vous êtes de retour d'une gamme de nœuds - Les éléments proches les uns des autres seront les mêmes branches de l'arbre. Plus les nœuds sont dans la gamme la plus rapide, ils peuvent être récupérés.

Avec un seul champ de l'index - L'ordre n'a pas d'importance. Si elles sont proches les uns dans l'ordre croissant, ils seront également regroupés dans l'ordre décroissant.

Lorsque vous avez un composé clé - L'ordre commence à la matière.

Par exemple, si la clé est Un ascendant B ordre croissant de l'indice pourrait ressembler à quelque chose comme ceci:

La Ligne A B
1 1 1
2 2 6
3 2 7 
4 3 4
5 3 5
6 3 6
7 5 1

Une requête pour un ascendant B décroissant aurez besoin de sauter autour de l'index de commande pour retourner les lignes et sera plus lent. Par exemple, il sera de retour Ligne 1, 3, 2, 6, 5, 4, 7

Distance de la requête dans le même ordre que l'index renvoie simplement les lignes de manière séquentielle dans l'ordre correct.

Trouver un enregistrement dans un Arbre prend O(Log(n)) de temps. Trouver une plage d'enregistrements dans l'ordre n'est OLog(n) + k, où k est le nombre d'enregistrements à retourner.

Si les enregistrements sont dans l'ordre, le coût pourrait être aussi élevé que OLog(n) * k

50voto

Zaid Masud Points 4536

La réponse simple que vous recherchez est que la direction ne compte que lorsque vous triez sur deux champs .

Si vous effectuez un tri sur {a : 1, b : -1} :

Index {a : 1, b : 1} sera plus lent que l' indice {a : 1, b : -1}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X