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 MongoDBrejectedPlans:
autres plans d'exécution envisagés mais rejetésinputStage:
étape initiale de la requêtestage:
type d'opération (e.g. IXSCAN, FETCH, SORT)indexName:
nom de l'index utilisénReturned:
nombre de documents retournésexecutionTimeMillis:
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()