MongoDB concatène la clé composée d'une certaine manière et l'utilise comme clé dans un BTree.
Lors de la recherche d'éléments uniques - L'ordre des nœuds dans l'arborescence n'est pas pertinent.
Si vous renvoyez une plage de nœuds - Les éléments proches les uns des autres seront dans les mêmes branches de l'arbre. Plus les nœuds sont proches dans la plage, plus vite ils peuvent être récupérés.
Avec un seul index de champ - L'ordre n'a pas d'importance. S'ils sont rapprochés dans l'ordre croissant, ils le seront également dans l'ordre décroissant.
Lorsque vous avez une clé composée - L'ordre commence à avoir de l'importance.
Par exemple, si la clé est A croissant B croissant, l'index peut ressembler à ceci:
Rangée AB
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 A croissant B décroissant devra sauter autour de l'index dans le désordre pour renvoyer les lignes et sera plus lente. Par exemple, il retournera Row1, 3, 2, 6, 5, 4, 7
Une requête à distance dans le même ordre que l'index renverra simplement les lignes séquentiellement dans le bon ordre.
La recherche d'un enregistrement dans un BTree prend O (Log (n)) temps. Trouver une plage d'enregistrements dans l'ordre n'est que OLog (n) + k où k est le nombre d'enregistrements à renvoyer.
Si les enregistrements sont dans le désordre, le coût peut être aussi élevé que OLog (n) * k
1, 3, 2, 6, 5, 4, 7
?La réponse simple que vous recherchez est que la direction n'a d'importance que lorsque vous triez sur deux champs ou plus .
Si vous triez sur
{a : 1, b : -1}
:L'index
{a : 1, b : 1}
sera plus lent que l' index{a : 1, b : -1}
la source
{a: -1, b: -1}
, dois-je avoir un{a: -1, b: -1}
index ou cela{a: 1, b: 1}
suffira.{a: 1, b: 1}
index devrait être suffisant car inverser complètement un index est très bien. par exemple, l'index sur{a: 1}
peut être utilisé pour un tri sur{a: -1}
Pourquoi les index
Comprenez deux points clés.
Les index ne sont pas gratuits. Ils prennent de la mémoire et imposent une pénalité de performance lors des insertions, des mises à jour et des suppressions. Normalement, l'impact sur les performances est négligeable (en particulier par rapport aux gains de performances de lecture), mais cela ne signifie pas que nous ne pouvons pas être intelligents dans la création de nos index.
Comment les index
Identifier le groupe de champs à indexer ensemble consiste à comprendre les requêtes que vous exécutez. L'ordre des champs utilisés pour créer votre index est critique. La bonne nouvelle est que, si vous vous trompez dans l'ordre, l'index ne sera pas du tout utilisé, il sera donc facile à repérer avec l'explication.
Pourquoi trier
Vos requêtes peuvent nécessiter un tri. Mais le tri peut être une opération coûteuse, il est donc important de traiter les champs sur lesquels vous triez comme un champ que vous interrogez. Ce sera donc plus rapide s'il a un index. Il y a cependant une différence importante, le champ que vous triez doit être le dernier champ de votre index. La seule exception à cette règle est que si le champ fait également partie de votre requête, la règle doit être le dernier ne s'applique pas.
Comment le tri
Vous pouvez spécifier un tri sur toutes les clés de l'index ou sur un sous-ensemble; cependant, les clés de tri doivent être répertoriées dans le même ordre qu'elles apparaissent dans l'index. Par exemple, un modèle de clé d'index {a: 1, b: 1} peut prendre en charge un tri sur {a: 1, b: 1} mais pas sur {b: 1, a: 1}.
Le tri doit spécifier le même sens de tri (c'est-à-dire croissant / décroissant) pour toutes ses clés comme modèle de clé d'index ou spécifier le sens de tri inversé pour toutes ses clés comme modèle de clé d'index. Par exemple, un modèle de clé d'index {a: 1, b: 1} peut prendre en charge un tri sur {a: 1, b: 1} et {a: -1, b: -1} mais pas sur {a: -1 , b: 1}.
Supposons qu'il existe ces index:
la source
{ a: 1, b: 1, c: 1 }
avez-vous vraiment besoin d'index{ a: 1}
et /{ a: 1, b: 1}
ou un index{ a: 1, b: 1, c: 1 }
couvre tous les cas? Si les requêtes utilisent toujours le même tri: 1 pas de tri dans la requête avec -1