Ce chapitre présente l'analyse des performances des requêtes MongoDB, similaire à l'explication de SQL, MongoDB prend également en charge l'explication pour analyser les performances des instructions de requête.
Utilisation de base
En appelant la fonction explain, vous pouvez obtenir le résultat de l'analyse
// Résultat de l'analyse de la méthode find
db.collection.find({}).explain();
// Résultat de l'analyse de la méthode aggregate
db.collection.explain().aggregate([]);
explain a trois modes:
- queryPlanner (par défaut)
- executionStats
- allPlansExecution
Explication :
- En utilisant queryPlanner, toutes les plans d'exécution possibles sont listés, l'instruction réelle n'est pas exécutée, et le plan gagnant qui a déjà été choisi est affiché.
- En utilisant executionStats, seul le plan gagnant est exécuté et les résultats sont affichés.
- En utilisant allPlansExecution, tous les plans sont exécutés et les résultats sont affichés.
Utilisation des différents modes
// Mode executionStats, il suffit de passer les paramètres à la fonction explain
db.collection.find({}).explain('executionStats');
// Mode allPlansExecution
db.collection.find({}).explain('allPlansExecution');
Explication du contenu de l'explication
Contenu de queryPlanner
Le contenu suivant est le contenu par défaut retourné par explain, en ignorant les informations non essentielles
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.orders",
"indexFilterSet" : false, // Métrique clé, indiquant si les données de filtrage d'index sont utilisées
"winningPlan" : {
"stage" : "COLLSCAN", // Métrique clé, nom de phase de stage. Chaque phase a des informations spécifiques à la phase, par ex. COLLSCAN représente le balayage de tout le contenu de la collection
"direction" : "forward"
},
"rejectedPlans" : [ ]
}
...
}
Les types de phase de stage sont les suivants :
- COLLSCAN: Balayage complet de la table
- IXSCAN: Balayage de l'index
- FETCH: Récupération de documents spécifiques basée sur l'index
- SHARD_MERGE: Fusion des données renvoyées par chaque fragment
- SORT: Indique le tri en mémoire
- LIMIT: Limite le nombre de retours
- SKIP: Ignorer l'utilisation
- IDHACK: Requête pour _id
- SHARDING_FILTER: Interrogation de données fragmentées via mongos
- COUNT: Opérations de comptage à l'aide de db.coll.explain().count() ou similaire
- COUNTSCAN: Renvoi de phase lorsque le comptage n'utilise pas un index pour le décompte
- COUNT_SCAN: Renvoi de phase lorsque le comptage utilise un index pour le décompte
- SUBPLA: Renvoi de phase pour les requêtes $or n'utilisant pas d'index
- TEXT: Renvoi de phase lors de requêtes à l'aide d'index de texte intégral
- PROJECTION: Renvoi de phase pour limiter les champs renvoyés
Contenu executionStats
Le contenu suivant est le contenu retourné en mode executionStats, en ignorant les informations non essentielles
{
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 5, // Nombre de documents retournés
"executionTimeMillis" : 0, // Temps d'exécution
"totalKeysExamined" : 0, // Nombre d'index explorés
"totalDocsExamined" : 5, // Nombre total de documents explorés
"executionStages" : {
"stage" : "COLLS CAN", // Type de stage, COLLSCAN signifie balayage de l'intégralité de la table
"nReturned" : 5,
"executionTimeMillisEstimate" : 0,
"works" : 7,
"advanced" : 5,
"needTime" : 1,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"direction" : "forward",
"docsExamined" : 5
}
}
}
Idées d'optimisation de requête
- Utiliser autant que possible les index
- Moins de documents explorés, c'est mieux