How to find the slow queries on MongoDb 🐢
If you are experiencing performance issues on your MongoDb, one of the things to check is what is consuming most of the time. Let's see how to find the slow queries on MongoDb
Enable profiling 📊
First of all, we must to active profiling in order to collect data of the operations. So connect to your MongoDb and execute:
// Collect about all operations
db.setProfilingLevel(2);
If you want to collect only for the queries above 100ms, just run:
// Collect about operations that take longer than +100ms
db.setProfilingLevel(1, { slowms: 100 });
In order to check if there was any previous level or confirm the new one, run:
db.getProfilingStatus();
Example output:
{ "was" : 0, "slowms" : 100, "sampleRate" : 1.0, "ok" : 1 }
Example of first-time activation ("was":0
) to collect longer than 100ms ("slowms":100
) and profiling is fine ("ok": 1
)
When you wish to disable it, run:
// Disable profiling
db.setProfilingLevel(0);
💡 More info in profiling doc
Find the slow queries 🐢
The operations data is stored on db.system.profile
collection.
Then in order to see the top 10 slow queries, run:
db.system.profile.find().limit(10).sort( { millis : -1 } ).pretty()
Slowest first. Depending on operation type (insert
, update
, aggregation
, etc.) you will find different fields and data.
So you can check if it's using indexes, if it's scanning more rows than needed and ultimately, what operations you need to take care first 🎯
💡 If you are dealing with performance issues, let me recommend you the performance guide on MongoDb doc
Leave a comment below with any doubt or question 👇