Aller au contenu

Les Explainable objects#

Introduction aux Explainable objects#

Présentation du concept d'Explainable objects#

  • Outils pour analyser et comprendre le fonctionnement des requêtes
  • Aide à l'optimisation des performances de la base de données

Objectif : analyser et optimiser les performances des requêtes#

  • Détection des goulots d'étranglement et des requêtes coûteuses
  • Mise en place de solutions pour améliorer les performances

Fonctionnement : obtenir des informations détaillées sur le plan d'exécution de requêtes#

  • Analyse du plan d'exécution généré par MongoDB pour chaque requête
  • Informations sur les index utilisés, les documents scannés, etc.

Méthode : utilisation de la méthode .explain() dans la CLI MongoDB#

  • Utilisation directe sur les requêtes, par exemple : db.collection.find({...}).explain()
  • Résultats sous forme d'un document JSON détaillé contenant
    • le plan d'exécution de la requête,
    • les index utilisés,
    • le nombre de documents scannés,
    • le temps d'exécution, etc.

Exemple

// Exemple de requête
db.users.find({age: {$gte: 18}})

// Utilisation de la méthode .explain()
db.users.find({age: {$gte: 18}}).explain()

Utilisation des Explainable objects pour analyser les requêtes#

Utilisation de la méthode .explain() sur les requêtes#

  • Permet d'obtenir des informations détaillées sur le plan d'exécution
  • Aide à identifier les problèmes de performance et les index manquants ou mal utilisés

Exemple de code : db.collection.find({...}).explain()#

db.products.find({category: "Electronics", price: {$gte: 100}}).explain()

Résultats : informations sur les index utilisés, nombre de documents scannés, temps d'exécution, etc.#

  • "queryPlanner : informations sur le plan d'exécution et les index utilisés
  • "executionStats" : statistiques détaillées sur le temps d'exécution, les documents scannés, etc.
  • "serverInfo" : informations sur le serveur et la version de MongoDB

Analyse des résultats pour détecter les problèmes de performances#

  • Identifier les index non utilisés ou inadaptés
  • Repérer les étapes coûteuses du plan d'exécution
  • Exemple : si "totalDocsExamined" est élevé, cela peut indiquer un problème d'indexation

Exemple

var explainResult = db.products.find({category: "Electronics", price: {$gte: 100}}).explain();
print("Index utilisé : ", explainResult.queryPlanner.winningPlan.inputStage.indexName);
print("Documents examinés : ", explainResult.executionStats.totalDocsExamined);
print("Temps d'exécution (ms) : ", explainResult.executionStats.executionTimeMillis);

Comprendre les plans d'exécution#

Importance de comprendre les plans d'exécution pour optimiser les requêtes#

  • Augmenter les performances des requêtes
  • Réduire le temps de réponse
  • Diminuer l'utilisation des ressources système

Structure du plan d'exécution : étapes, coût, index utilisés, etc.#

  • winningPlan: plan d'exécution choisi par MongoDB
  • rejectedPlans: autres plans d'exécution envisagés mais rejetés
  • inputStage: étape initiale de la requête
  • stage: type d'opération (e.g. IXSCAN, FETCH, SORT)
  • indexName: nom de l'index utilisé
  • nReturned: nombre de documents retournés
  • executionTimeMillis: temps d'exécution en millisecondes

Identification des parties coûteuses du plan d'exécution#

  • Analyser executionTimeMillis pour détecter les étapes lentes
  • Examiner nReturned pour identifier les requêtes inefficaces
  • Vérifier inputStage et les opérations stage pour repérer les optimisations potentielles

Utilisation des informations pour améliorer les performances de la requête#

  • Adapter les index en fonction des étapes coûteuses
  • Modifier la requête pour utiliser les index optimisés
  • Comparer les plans d'exécution avant et après optimisation

Exemple#

Exécuter une requête avec .explain() pour afficher le plan d'exécution :

> db.collection.find({ field1: value1, field2: value2 }).explain()
{
  "queryPlanner": {
    "winningPlan": {
      "stage": "FETCH",
      "inputStage": {
        "stage": "IXSCAN",
        "keyPattern": { "field1": 1 },
        "indexName": "field1_1",
        ...
      },
      ...
    },
    "rejectedPlans": [...],
    ...
  },
  "executionStats": {
    "nReturned": 10,
    "executionTimeMillis": 120,
    ...
  },
  ...
}

Créer un nouvel index pour améliorer les performances :

db.collection.createIndex({ field1: 1, field2: 1 })

Réexécuter la requête avec .explain() pour vérifier l'amélioration des performances :

db.collection.find({ field1: value1, field2: value2 }).explain()