Pourquoi les index
Comprenez deux points clés.
- Alors qu'un index vaut mieux que pas d'index, l'index correct est bien meilleur que l'un ou l'autre.
- MongoDB n'utilisera qu'un seul index par requête, créant des index composés avec un ordre de champ approprié pour ce que vous souhaitez probablement utiliser.
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:
{ a: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }
Example Index Used
db.data.find().sort( { a: 1 } ) { a: 1 }
db.data.find().sort( { a: -1 } ) { a: 1 }
db.data.find().sort( { a: 1, b: 1 } ) { a: 1, b: 1 }
db.data.find().sort( { a: -1, b: -1 } ) { a: 1, b: 1 }
db.data.find().sort( { a: 1, b: 1, c: 1 } ) { a: 1, b: 1, c: 1 }
db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } ) { a: 1, b: 1 }
1, 3, 2, 6, 5, 4, 7
?