Créer des index MongoDB

MongoDBBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez les techniques fondamentales pour créer et gérer des index dans MongoDB. Les index sont cruciaux pour optimiser les performances de la base de données, car ils permettent à la base de données de trouver et de récupérer des données beaucoup plus rapidement que de parcourir chaque document d'une collection. Vous pratiquerez la création d'index à champ unique, composés et uniques, l'analyse de leur impact sur les performances des requêtes et la gestion de leur cycle de vie. À la fin de ce laboratoire, vous aurez une solide compréhension de la manière d'utiliser les index pour rendre vos requêtes MongoDB plus efficaces.

Créer un index sur un seul champ

Dans cette première étape, vous allez vous connecter à MongoDB, créer une base de données avec une collection d'exemple, puis créer votre premier index sur un champ unique. Un index sur un champ unique améliore les performances des requêtes qui filtrent ou trient sur ce champ spécifique.

Tout d'abord, ouvrez le shell MongoDB en tapant mongosh dans votre terminal. Cela vous connectera au serveur MongoDB en cours d'exécution dans votre environnement.

mongosh

Une fois que vous êtes dans le shell MongoDB, vous verrez une invite >. Créons et basculons vers une nouvelle base de données nommée indexlab. Toutes les commandes ultérieures dans ce laboratoire seront exécutées dans ce shell, sauf indication contraire.

use indexlab

Maintenant, insérons quelques documents d'exemple dans une nouvelle collection nommée users. Ces données seront utilisées tout au long du laboratoire.

db.users.insertMany([
  { name: "Alice", age: 28, email: "alice@example.com" },
  { name: "Bob", age: 35, email: "bob@example.com" },
  { name: "Charlie", age: 42, email: "charlie@example.com" }
]);

Une fois nos données en place, créons un index sur le champ name. Un index sur un champ unique permet d'accélérer les requêtes qui recherchent des documents par ce champ.

db.users.createIndex({ name: 1 });

Dans la commande ci-dessus, { name: 1 } spécifie que l'index doit être créé sur le champ name par ordre croissant. L'utilisation de -1 créerait un index par ordre décroissant.

Pour vérifier que l'index a été créé, vous pouvez lister tous les index de la collection users.

db.users.getIndexes();

Vous devriez voir deux index dans la sortie. L'un est l'index par défaut _id créé par MongoDB sur chaque collection, et l'autre est l'index name_1 que vous venez de créer.

[
  { "v": 2, "key": { "_id": 1 }, "name": "_id_" },
  { "v": 2, "key": { "name": 1 }, "name": "name_1" }
]

Créer un index composé

Bien que les index sur champ unique soient utiles, de nombreuses requêtes filtrent sur plusieurs champs. Pour ces cas, un index composé, qui inclut plusieurs champs, peut apporter une amélioration significative des performances. Dans cette étape, vous allez créer un index composé.

Continuons dans le shell mongosh. Nous allons créer un index composé sur les champs age et name. L'ordre des champs dans un index composé est important. MongoDB peut utiliser cet index pour prendre en charge les requêtes sur age seul, ou sur age et name.

db.users.createIndex({ age: -1, name: 1 });

Cette commande crée un index qui trie d'abord les documents par age dans l'ordre décroissant (-1), puis, pour les documents ayant le même âge, les trie par name dans l'ordre croissant (1).

Ajoutons quelques documents supplémentaires pour rendre notre collection plus diversifiée pour les requêtes.

db.users.insertMany([
  { name: "David", age: 28, email: "david@example.com" },
  { name: "Eve", age: 35, email: "eve@example.com" }
]);

Maintenant, affichez à nouveau la liste des index pour voir votre nouvel index composé.

db.users.getIndexes();

La sortie inclura maintenant l'index age_-1_name_1, en plus des précédents.

[
  { "v": 2, "key": { "_id": 1 }, "name": "_id_" },
  { "v": 2, "key": { "name": 1 }, "name": "name_1" },
  { "v": 2, "key": { "age": -1, "name": 1 }, "name": "age_-1_name_1" }
]

Cet index composé servira efficacement les requêtes qui filtrent ou trient par age, ou par age puis par name.

Créer un index unique

Les index peuvent également être utilisés pour garantir l'intégrité des données. Un index unique garantit que le champ (ou les champs) indexé(s) ne contient pas de valeurs dupliquées. Dans cette étape, vous allez créer un index unique pour empêcher les adresses e-mail dupliquées dans la collection users.

Créons un index unique sur le champ email. Ceci est fait en ajoutant l'option { unique: true } lors de la création de l'index.

db.users.createIndex({ email: 1 }, { unique: true });

Maintenant que l'index unique est en place, MongoDB rejettera toute tentative d'insertion ou de mise à jour d'un document s'il en résulte une valeur dupliquée pour le champ email.

Testons cela. Tout d'abord, essayez d'insérer un document avec un nouvel e-mail unique. Cela devrait réussir.

db.users.insertOne({ name: "Frank", age: 31, email: "frank@example.com" });

Ensuite, tentez d'insérer un autre document avec un e-mail existant, tel que alice@example.com. Cette opération échouera. Le bloc try...catch vous permet de voir l'erreur sans être déconnecté du shell mongosh.

try {
  db.users.insertOne({ name: "Fiona", age: 29, email: "alice@example.com" });
} catch (e) {
  print(e);
}

La commande générera une erreur indiquant une violation de clé dupliquée. La sortie contiendra un message tel que E11000 duplicate key error collection.

Vous pouvez à nouveau afficher vos index pour voir la propriété de contrainte unique.

db.users.getIndexes();

Remarquez la propriété unique: true sur l'index email_1 dans la sortie.

[
  ...,
  {
    v: 2,
    key: { email: 1 },
    name: 'email_1',
    unique: true
  }
]

Analyser l'utilisation des index avec explain()

La création d'index n'est que la moitié du travail ; vous devez également vérifier que MongoDB les utilise réellement pour vos requêtes. La méthode explain() est un outil puissant pour cela, fournissant des informations détaillées sur la manière dont une requête est exécutée. Cette étape vous montrera comment utiliser explain() pour vérifier que MongoDB utilise efficacement vos index existants.

Analysons une requête qui recherche des utilisateurs d'un certain âge. Puisque nous avons déjà l'index composé age_-1_name_1 de l'étape précédente, MongoDB peut utiliser cet index pour optimiser la requête sur le champ age.

db.users.find({ age: 35 }).explain("executionStats");

Dans la sortie, recherchez le champ executionStats.stage à l'intérieur de winningPlan. Vous devriez voir la valeur IXSCAN, qui signifie "Index Scan". Cela indique que MongoDB utilise l'index composé existant age_-1_name_1 pour localiser rapidement les documents pertinents. Vous devriez également constater que totalDocsExamined correspond au nombre de documents renvoyés, démontrant l'efficacité de l'utilisation de l'index composé.

Pour mieux comprendre comment MongoDB choisit les index, testons également une requête qui peut bénéficier de l'index sur champ unique name que nous avons créé précédemment.

db.users.find({ name: "Alice" }).explain("executionStats");

Cette requête devrait également afficher IXSCAN comme étape du plan gagnant (winningPlan), confirmant que MongoDB utilise l'index name_1 que nous avons créé dans la première étape.

Afficher et supprimer les index

La dernière partie de la gestion des index consiste à savoir comment les lister et les supprimer lorsqu'ils ne sont plus nécessaires. Les index inutilisés consomment toujours du stockage et ajoutent une surcharge aux opérations d'écriture, il est donc bon de les nettoyer.

Tout d'abord, obtenons une liste complète de tous les index que vous avez créés jusqu'à présent dans la collection users.

db.users.getIndexes();

Cette commande fournit un aperçu complet de votre configuration d'index actuelle. Supposons que vous décidiez que l'index composé age_-1_name_1 n'est plus nécessaire. Vous pouvez le supprimer en utilisant la méthode dropIndex(), en spécifiant le nom de l'index.

db.users.dropIndex("age_-1_name_1");

Après avoir exécuté la commande, vous recevrez un message de confirmation. Pour en être sûr, vous pouvez lister les index une dernière fois pour vérifier qu'il a bien été supprimé.

db.users.getIndexes();

L'index age_-1_name_1 ne devrait plus apparaître dans la liste.

Si vous devez supprimer tous les index personnalisés d'une collection (à l'exception de l'index par défaut _id), vous pouvez utiliser la méthode dropIndexes(). Cette commande est puissante, utilisez-la donc avec précaution.

// Exemple : db.users.dropIndexes()

Cela conclut les opérations de base pour la gestion des index dans MongoDB. Vous pouvez maintenant quitter le shell mongosh.

exit;

Résumé

Dans ce laboratoire, vous avez acquis les compétences essentielles pour travailler avec les index MongoDB. Vous avez commencé par créer un index simple sur un seul champ pour accélérer les requêtes simples. Vous êtes ensuite passé à la création d'un index composé pour optimiser les requêtes impliquant plusieurs champs. Vous avez également appris à garantir l'intégrité des données en créant un index unique. De plus, vous avez utilisé la méthode explain() pour analyser les plans de requête et confirmer que vos index étaient utilisés efficacement, en observant la différence de performance entre un parcours de collection (collection scan) et un parcours d'index (index scan). Enfin, vous vous êtes entraîné à gérer vos index en les listant et en les supprimant. La maîtrise de ces techniques d'indexation est une étape cruciale pour construire des applications rapides et évolutives avec MongoDB.