Gestion et fonctionnement des index#
Création d'index#
Utiliser la commande createIndex pour créer un index#
- Créer un index simple
- Exemple d'index simple :
db.collection.createIndex({ champ: 1 })
- champ représente le nom du champ à indexer
- 1 signifie un ordre de tri croissant
- Exemple d'index simple :
Préciser l'ordre de tri#
- Définir l'ordre de tri avec 1 (croissant) ou -1 (décroissant)
- Exemple d'index composé :
db.collection.createIndex({ champ1: 1, champ2: -1 })
- L'index sera trié d'abord par
champ1
en ordre croissant, puis parchamp2
en ordre décroissant
- L'index sera trié d'abord par
Créer un index en arrière-plan#
- Permet d'éviter de bloquer les opérations sur la collection pendant la construction de l'index
- Utiliser l'option
{ background: true }
- Exemple :
db.collection.createIndex({ champ: 1 }, { background: true })
Suppression d'index#
Supprimer un index#
- Utiliser la commande
db.collection.dropIndex(...)
- Exemple de commande :
db.collection.dropIndex("champ_1")
- Exemple de commande :
Supprimer tous les index d'une collection#
- Utiliser la commande
db.collection.dropIndexes()
- Exemple de commande :
db.maCollection.dropIndexes()
- Exemple de commande :
Exemple#
// Créer un index sur le champ "age" de la collection "users"
db.users.createIndex({ age: 1 })
// Vérifier que l'index a été créé
db.users.getIndexes()
// Supprimer l'index sur le champ "age"
db.users.dropIndex("age_1")
// Vérifier que l'index a été supprimé
db.users.getIndexes()
// Supprimer tous les index de la collection "users" (sauf l'index par défaut sur le champ "_id")
db.users.dropIndexes()
Analyse des index existants#
Lister les index d'une collection#
- Utiliser la commande :
db.maCollection.getIndexes()
- Permet d'afficher tous les index de la collection et leurs propriétés
Identifier les index les plus utilisés#
- Utiliser la commande :
db.maCollection.aggregate([ { $indexStats: {} } ])
- Permet d'obtenir des statistiques sur l'utilisation des index pour optimiser les performances
Exemple d'analyse des index existants#
// Créer une collection avec des index :
db.maCollection.insertMany([
{ champ1: "valeur1", champ2: "valeur2" },
{ champ1: "valeur3", champ2: "valeur4" }
])
db.maCollection.createIndex({ champ1: 1 })
db.maCollection.createIndex({ champ2: 1 })
//Lister les index de la collection :
db.maCollection.getIndexes()
Résultat :
[
{
"v": 2,
"key": {
"_id": 1
},
"name": "_id_"
},
{
"v": 2,
"key": {
"champ1": 1
},
"name": "champ1_1"
},
{
"v": 2,
"key": {
"champ2": 1
},
"name": "champ2_1"
}
]
Obtenir les statistiques d'utilisation des index :
db.maCollection.aggregate([ { $indexStats: {} } ])
Résultat :
[
{
"name" : "_id_",
"key" : {
"_id" : 1
},
"host" : "localhost:27017",
"accesses" : {
"ops" : 4,
"since" : ISODate("..."),
"note" : "..."
}
},
...
]
Gestion des index en arrière-plan#
Concept des index en arrière-plan#
- Permet aux autres opérations de continuer pendant la création de l'index
- Avantages : évite de bloquer les opérations de la base de données lors de la création d'index
- Incovénients:
- Peuvent prendre plus de temps à créer que les index créés en mode normal (foreground)
- Utilisent plus de ressources système (CPU, mémoire) pendant leur création
Fonctionnement des index en arrière-plan#
- Ajouter
{ background: true }
lors de la création d'index - Exemple de commande shell pour créer un index en arrière-plan :
db.collection.createIndex({ champ: 1 }, { background: true })
Exemple de création d'un index en arrière-plan#
db.utilisateurs.createIndex({ email: 1 }, { background: true })
Utilisation de l'option "sparse"#
Concept des index "sparse"#
- N'incluent que les documents contenant le champ indexé
- Ignorent les documents sans le champ spécifié, réduisant ainsi la taille de l'index
- Peuvent améliorer les performances pour les collections avec des structures variables
- Commande:
db.collection.createIndex({ champ: 1 }, { sparse: true })
Exemple#
Création d'un index "sparse" sur le champ "age" :
db.users.createIndex({ age: 1 }, { sparse: true })
Insertion de documents avec et sans le champ "age" :
db.users.insertMany([{ name: "Alice", age: 30 }, { name: "Bob" }])
Requête utilisant l'index "sparse" :
db.users.find({ age: { $gt: 25 } })
... retourne uniquement le document avec "Alice" et "age" 30, car l'index "sparse" n'inclut pas le document "Bob" sans le champ "age"