web-dev-qa-db-fra.com

Comment trouver des requêtes n'utilisant pas d'index ou lentes dans mongodb

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
23
DmitrySemenov

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 .

18
Stennie

Tout d'abord, vous devez configurer votre profilage, en spécifiant le niveau de journal souhaité. Les 3 options sont:

  • 0 - enregistreur désactivé
  • 1 - Journal des requêtes lentes
  • 2 - enregistrer toutes les requêtes

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:

  • rechercher tous les journaux dans une collection, en les classant par horodatage croissant:

db.system.profile.find( { ns:/<db>.<collection>/ } ).sort( { ts: 1 } );

  • recherche de journaux de requêtes avec plus de 5 millisecondes:

db.system.profile.find( {millis : { $gt : 5 } } ).sort( { ts: 1} );

14
Rafael Eyng

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.
6
Ori Dar

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
....
3
Mariano Ruiz

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 COLLSCANs 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/

1
Brian Morton