Aller au contenu

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

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 par champ2 en ordre décroissant

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")

Supprimer tous les index d'une collection#

  • Utiliser la commande db.collection.dropIndexes()
    • Exemple de commande : db.maCollection.dropIndexes()

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"