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 qui sont lentes? 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
22
demandé sur meagar 2013-08-26 23:34:27

6 réponses

L'approche équivalente dans MongoDB serait d'utiliser le requête profiler pour dépister et diagnostiquer les requêtes lentes.

Avec le profilage activé pour une base de données, les opérations lentes sont écrites dans la collection plafonnée system.profile (qui a par défaut une taille de 1 Mo). Vous pouvez ajuster le seuil pour les opérations lentes (par défaut 100 ms) en utilisant le slowms paramètre .

18
répondu Stennie 2017-01-31 02:59:00

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

  • 0-enregistreur désactivé
  • 1-journaliser les requêtes lentes
  • 2-journaliser toutes les requêtes

Vous le faites en exécutant votre mongod deamon 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:

  • trouver tous les journaux dans une collection, en ordonnant par ordre croissant horodatage:

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

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

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

12
répondu Rafael Eyng 2016-11-23 20:25:48

Vous pouvez utiliser les deux options mongod suivantes. La première option échoue les requêtes n'utilisant pas d'index( V 2.4 uniquement), la seconde enregistre les requêtes plus lentes qu'un certain seuil ms (la valeur par défaut est 100ms)

--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
répondu Ori Dar 2013-08-26 19:43:55

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 une opération comme lente. Dans l'exemple suivant, le seuil est fixé à 10 millisecondes pour une base de données nommée "ventes":

$ mongotail sales -l 1
Profiling level set to level 1
$ mongotail sales -s 10
Threshold profiling set to 10 milliseconds

Ensuite, pour voir dans "Temps Réel" les requêtes lentes, avec quelques informations supplémentaires comme l'Heure de chaque requête pris, ou combien de registres il faut "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
répondu Mariano Ruiz 2016-08-15 00:21:50

Au cas où quelqu'un finirait ici de Google sur cette ancienne question, j'ai trouvé que explain m'a vraiment aidé à résoudre des requêtes spécifiques que je pouvais voir causer COLLSCANs à partir des 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 choses.

Https://docs.mongodb.com/manual/reference/method/cursor.explain/

0
répondu Brian Morton 2017-04-21 18:37:19

Alors que vous pouvez évidemment utiliser Profiler une fonctionnalité très soignée de Mongo DB en raison de laquelle je tombe en amour avec elle est Mongo DB MMS. Prend moins de 60 secondes et peut gérer de n'importe où. Je suis sûr que vous allez l'adorer. https://mms.mongodb.com/

-4
répondu HackerNews 2014-05-08 08:31:50