Skip to content

Instantly share code, notes, and snippets.

@rantav
Created August 23, 2012 06:13
Show Gist options
  • Select an option

  • Save rantav/3433277 to your computer and use it in GitHub Desktop.

Select an option

Save rantav/3433277 to your computer and use it in GitHub Desktop.
Find slow queries in mongo DB

A few show tricks to find slow queries in mongodb

Enable profiling

First, you have to enable profiling

> db.setProfilingLevel(1)

Now let it run for a while. It collects the slow queries ( > 100ms) into a capped collections, so queries go in and if it's full, old queries go out, so don't be surprised that it's a moving target...

Histogram of the slowest collections (collections with the slowest queries) - number of queries per collection

This presents a histogram of slow collections

> db.system.profile.group({key: {ns: true}, initial: {count: 0}, reduce: function(obj,prev){ prev.count++;}})

Histogram of the slowest collections (collections with the slowest queries) - number of millies spent in each collection

> db.system.profile.group({key: {ns: true}, initial: {millis: 0}, reduce: function(obj, prev){ prev.millis += obj.millis;}})

Find the most recent slow query

> db.system.profile.find().sort({$natural: -1}).limit(1)

Find the single slowest query in the capped system.profile collection right now

> db.system.profile.find().sort({millis: -1}).limit(1)
@caltuntas
Copy link
Copy Markdown

db.collection.group() has been deprecated since Mongo 3.4 so db.system.profile.group queries won't work if you have newer version.
You have to use aggregate operations, for instance

db.system.profile.aggregate(
{ $group : {
_id :"$op",
count:{$sum:1},
"max response time":{$max:"$millis"},
"avg response time":{$avg:"$millis"}
}});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment