Maîtriser les index composés dans MongoDB
Ce guide explore les subtilités des index composés dans MongoDB, une technique cruciale pour optimiser les performances de la base de données. Nous aborderons tout, de la compréhension de leur fonctionnement fondamental à l’analyse de leur efficacité et à la résolution des problèmes courants.
- Comprendre les index composés
- Créer des index composés
- Requêtes avec des index composés
- Analyser l’utilisation des index
- Bonnes pratiques et optimisation
- Foire aux questions
1. Comprendre les index composés
Dans MongoDB, un index composé est un index couvrant plusieurs champs au sein d’un seul document. Contrairement aux index à champ unique, qui n’accélèrent que les requêtes sur un seul champ, les index composés augmentent considérablement la vitesse des requêtes impliquant plusieurs champs, impactant significativement les performances de l’application. L’ordre des champs dans l’index est crucial ; MongoDB utilise cet ordre pour localiser efficacement les documents.
Les requêtes correspondant aux champs principaux de l’index bénéficient le plus. Si une requête utilise uniquement les champs principaux, l’index est pleinement utilisé à la fois pour le filtrage et le tri. Cependant, si une requête utilise des champs au-delà de l’index, MongoDB pourrait partiellement utiliser l’index, potentiellement en revenant à une analyse de la collection pour les critères restants, annulant les gains de performance.
Par exemple, considérons une collection products
avec les champs category
, price
et name
. Un index composé sur { "category": 1, "price": -1 }
optimise les requêtes filtrant par category
puis triant par price
dans l’ordre décroissant.
2. Créer des index composés
Créer des index composés est simple à l’aide de la méthode db.collection.createIndex()
. L’argument est un document où les clés représentent les noms des champs et les valeurs représentent l’ordre de tri (1 pour croissant, -1 pour décroissant).
// Créer un index composé sur category (croissant) et price (décroissant)
db.products.createIndex( { category: 1, price: -1 } );
// Créer un index composé sur plusieurs champs, avec des ordres de tri variés
db.users.createIndex( { firstName: 1, lastName: -1, age: 1 } );
// Ajouter les options unique et sparse
db.products.createIndex( { category: 1, price: -1 }, { unique: true, sparse: true } );
unique: true
impose l’unicité sur les champs indexés, tandis que sparse: true
indexe uniquement les documents où les champs indexés ne sont pas nuls.
3. Requêtes avec des index composés
L’optimiseur de requêtes de MongoDB utilise automatiquement un index composé si la requête correspond aux champs principaux et que l’ordre de tri est aligné. Par exemple, la requête suivante bénéficie de l’index { "category": 1, "price": -1 }
:
db.products.find( { category: "Electronics" } ).sort( { price: -1 } );
Cette requête filtre par category
(le champ d’index principal) et trie par price
(correspondant à l’ordre de tri de l’index). Cependant, cette requête ne bénéficierait pas autant :
db.products.find( { price: { $lt: 100 } } ).sort( { category: 1 } );
price
n’est pas le champ principal, et l’ordre de tri ne correspond pas à l’index.
4. Analyser l’utilisation des index
Utilisez db.collection.find().explain()
pour analyser l’utilisation des index. Cela fournit des informations détaillées sur le plan d’exécution de la requête, y compris les index utilisés (ou non) et les temps d’exécution.
db.products.find( { category: "Electronics" } ).sort( { price: -1 } ).explain();
Examinez la section « executionStats ». Si l’index est utilisé, vous verrez l’utilisation de la clé d’index et le nombre de documents examinés. « COLLSCAN » indique une analyse complète de la collection, moins efficace que l’utilisation d’un index.
5. Bonnes pratiques et optimisation
Une sélection minutieuse des index est cruciale. Une indexation excessive ralentit les opérations d’écriture, tandis qu’une indexation insuffisante conduit à des requêtes inefficaces. Priorisez les modèles de requêtes fréquemment utilisés, en ajoutant des index progressivement selon les besoins. Surveillez régulièrement l’utilisation des index et ajustez-les en fonction des besoins de l’application. Envisagez d’utiliser l’interface graphique MongoDB Compass pour une gestion plus simple des index.
6. Foire aux questions
- Combien d’index composés dois-je créer ? Le nombre optimal dépend des modèles de requêtes de votre application. Un équilibre est nécessaire pour éviter une indexation excessive.
- Que se passe-t-il si ma requête ne correspond pas parfaitement à l’index ? MongoDB pourrait utiliser des parties de l’index, mais pourrait toujours recourir à une analyse de la collection pour les parties non correspondantes.
- Puis-je créer des index composés avec des champs croissants/décroissants mélangés ? Oui, l’ordre est crucial pour des performances optimales.
- Comment supprimer un index composé ? Utilisez
db.collection.dropIndex()
, en spécifiant le nom de l’index ou la spécification :
// Supprimer par nom
db.products.dropIndex("category_1_price_-1");
// Supprimer par spécification
db.products.dropIndex( { category: 1, price: -1 } );