La commande explain
est utilisée pour savoir ce que fati la base de données d’une requête donnée: comment elle l’exécute, quels index sont utilisées, combien de documents sont inspectés, etc.
On ne peut pas l’utiliser sur l’instruction insert
.
Pour lister les méthodes qu’explain
prend en charge, utiliser la commande help
:
db.students.explain().help()
La commande explain
a différents modes, permettant d’afficher différentes statistiques:
queryPlanner
C’est le mode par défaut. Indique les index que la base de données utilise.
db.students.explain().find({ enseignants : {$all :[0,1]} } })
executionStats
Indique quels sont les résultats des index: combien de documents ont été inspectés, combien ont été retournés, combien de temps ça a pris…
db.students.explain('executionStats').find({ enseignants : {$all :[0,1]} } })
ou
db.students.explain(true).find({ enseignants : {$all :[0,1]} } })
allPlansExecution
Périodiquement, l’optimiseur de requête exécute tous les index possibles qui pourraient être utilisés sur une requête, et garde en mémoire l’index le plus rapide pour exécuter les requêtes suivantes. Le mode allPlansExecution retourne les stats obtenues.
db.students.explain('allPlansExecution').find({ teachers: {$all:[0,1]} })
Le moteur de stockage est l’interface entre le stockage (disque) et la base de données (MongoDB): le driver requête le serveur MongoDB, qui le relaie ensuite sur le disque via un moteur de stockage pour créer, lire, mettre à jour et supprimer des données.
Le moteur de stockage peut être modifié et selon celui qu’on utilise, les performances ne sont pas les mêmes pour différentes opérations. Les deux principaux moteurs de stockage sont MMAP (par défaut) et WiredTiger. Le moteur de stockage n’affecte pas la communication entre les différents serveurs MongoDB ni l’API de la base de données.
MongoDB MMAP permet
WiredTiger
Les fichiers MMAP et WiredTiger sont incompatibles.
Pour démarrer MongoDB avec WiredTiger:
killall mongodb
mongod -dbpath data -storageEngine wiredTiger
Par défaut, MongoDB logge les requêtes lentes de plus de 100ms dans la sortie console.
Pour démarrer MongoDB avec une durée autre, passer le paramètre --slowms <integer>
mongod --slowms 2
Il est possible d’écrire les requêtes effectuées vers system.profile
. Il s’agit d’une cap collection, ce qui signifie qu’elle a une taille fixe et que l’espace est recyclé une fois remplit (les anciennes logs sont effacées).
Pour logger les requêtes, il faut activer le profiler. Trois modes sont possibles:
0
(par défaut), désactivé1
logger les requêtes lentes2
logger toutes les requêtesPour démarrer MongoDB avec le profiler, passer le paramètre --profile <integer>
mongod --profile 1 --slowms 2
Pour changer le mode du profiler, utiliser setProfilingLevel
:
db.setProfilingLevel(0) // --profile 0
db.setProfilingLevel(1,4) // --profile 1 --slowms 4
Pour afficher le statut du profiler:
db.getProfilingLevel()
db.getProfilingStatus()
mongotop
est nommée d’après la commande Unix top
. Elle affiche où MongoDB passe son temps.
mongotop 3 # rafraîchir toutes les 3 secondes
ns total read write 2014-12-19T15:32:01-05:00
admin.system.roles 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
local.me 0ms 0ms 0ms
local.oplog.rs 0ms 0ms 0ms
local.replset.minvalid 0ms 0ms 0ms
local.startup_log 0ms 0ms 0ms
local.system.indexes 0ms 0ms 0ms
local.system.namespaces 0ms 0ms 0ms
local.system.replset 0ms 0ms 0ms
mongostat
est nommée d’après la commande iostat
. Elle échantillonne la base de données seconde par seconde et donne des informations sur qu’elle fait: nombre d’insertions, de requêtes, mise à jour et suppressions.
mongostat
insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time
991 *0 *0 *0 0 2|0 3.4% 4.5% 0 2.90G 297M 0|0 0|0 12.9m 84.2k 2 Oct 6 09:45:37.478
989 *0 *0 *0 0 2|0 3.6% 4.7% 0 2.91G 310M 0|0 0|0 12.9m 84.1k 2 Oct 6 09:45:38.476
988 *0 *0 *0 0 1|0 3.7% 4.8% 0 2.92G 323M 0|0 0|0 12.8m 83.8k 2 Oct 6 09:45:39.481
976 *0 *0 *0 0 2|0 3.9% 5.0% 0 2.94G 335M 0|0 0|0 12.7m 83.7k 2 Oct 6 09:45:40.476