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
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 .
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} );
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.
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
....
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 COLLSCAN
s à 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/
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/