existe-t-il un moyen de trouver des requêtes dans mongodb qui n'utilisent pas d'index ou sont LENT? Dans MySQL, cela est possible avec les paramètres suivants dans le fichier de configuration:
log-queries-not-using-indexes = 1
log_slow_queries = /tmp/slowmysql.log
L'approche équivalente dans MongoDB serait d'utiliser le profileur de requêtes pour suivre et diagnostiquer les requêtes lentes.
Avec le profilage activé pour une base de données, les opérations lentes sont écrites dans le system.profile
collection plafonnée (dont la taille par défaut est de 1 Mo). Vous pouvez ajuster le seuil des opérations lentes (par défaut 100 ms) en utilisant le paramètre slowms
.
Tout d'abord, vous devez configurer votre profilage, en spécifiant le niveau de journal souhaité. Les 3 options sont:
Pour ce faire, exécutez votre mongod
démon avec les options --profile
:
mongod --profile 2 --slowms 20
Avec cela, les journaux seront écrits dans la collection system.profile
, Sur laquelle vous pouvez effectuer des requêtes comme suit:
db.system.profile.find( { ns:/<db>.<collection>/ } ).sort( { ts: 1 } );
db.system.profile.find( {millis : { $gt : 5 } } ).sort( { ts: 1} );
Vous pouvez utiliser les deux options mongod suivantes. La première option échoue aux requêtes n'utilisant pas d'index (V 2.4 uniquement), la seconde enregistre les requêtes plus lentement que le seuil de quelques ms (la valeur par défaut est 100 ms)
--notablescan
Forbids operations that require a table scan.
--slowms <value>
Defines the value of “slow,” for the --profile option. The database logs all slow queries to the log, even when the profiler is not turned on. When the database profiler is on, mongod the profiler writes to the system.profile collection. See the profile command for more information on the database profiler.
Vous pouvez utiliser l'outil de ligne de commande mongotail pour lire le journal du profileur dans une console et avec un format plus lisible.
Activez d'abord le profileur et définissez le seuil en millisecondes pour que le profil considère qu'une opération est lente. Dans l'exemple suivant, le seuil est défini sur 10 millisecondes pour une base de données nommée "sales":
$ mongotail sales -l 1
Profiling level set to level 1
$ mongotail sales -s 10
Threshold profiling set to 10 milliseconds
Ensuite, pour voir en "temps réel" les requêtes lentes, avec des informations supplémentaires comme le temps nécessaire à chaque requête ou le nombre de registres nécessaires " marcher "pour trouver un résultat particulier:
$ mongotail sales -f -m millis nscanned docsExamined
2016-08-11 15:09:10.930 QUERY [ops] : {"deleted": {"$exists": false}, "prod_id": "367133"}. 8 returned. nscanned: 344502. millis: 12
2016-08-11 15:09:10.981 QUERY [ops] : {"deleted": {"$exists": false}, "prod_id": "367440"}. 6 returned. nscanned: 345444. millis: 12
....
Au cas où quelqu'un se retrouverait ici de Google sur cette vieille question, j'ai trouvé que explain
m'a vraiment aidé à corriger des requêtes spécifiques que je pouvais voir causer des COLLSCAN
s dans les journaux.
Exemple:
db.collection.find().explain()
Cela vous permettra de savoir si la requête utilise un COLLSCAN
(curseur de base) ou un index
(BTree), entre autres.
https://docs.mongodb.com/manual/reference/method/cursor.explain/