Home >>MongoDB Tutorial >MongoDB Analyzing Queries
A very critical aspect of measuring how productive the database and indexing design is is the analysis of queries. We're going to talk about the $explain and $hint queries used most.
Operator $explain offers query information, indexes used in a query, and other statistics. When you evaluate how well your indexes are optimized, it is very useful.
We have already generated an index for the user collection of gender and user name fields in the last chapter using the following query.
>db.users.createIndex({gender:1,user_name:1}) { "numIndexesBefore" : 2, "numIndexesAfter" : 2, "note" : "all indexes already exist", "ok" : 1 }
We will now use $explain on the following query –
>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()
The above explain() query returns the following analyzed result −
{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "mydb.users", "indexFilterSet" : false, "parsedQuery" : { "gender" : { "$eq" : "M" } }, "queryHash" : "B4037D3C", "planCacheKey" : "DEAAE17C", "winningPlan" : { "stage" : "PROJECTION_COVERED", "transformBy" : { "user_name" : 1, "_id" : 0 }, "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "gender" : 1, "user_name" : 1 }, "indexName" : "gender_1_user_name_1", "isMultiKey" : false, "multiKeyPaths" : { "gender" : [ ], "user_name" : [ ] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "gender" : [ "[\"M\", \"M\"]" ], "user_name" : [ "[MinKey, MaxKey]" ] } } }, "rejectedPlans" : [ ] }, "serverInfo" : { "host" : "Krishna", "port" : 27017, "version" : "4.2.1", "gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e" }, "ok" : 1 }
In this result set, we can now look at the fields,
The $hint operator forces the query optimizer to run a query using the index defined. When you want to test the performance of a query with different indexes, this is especially helpful. For example, the following query defines the index to be used for this query for the gender and user name fields.
db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}) { "user_name" : "tombenzamin" }
To analyze the above query using $explain −
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()
Which gives you the following result −
{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "mydb.users", "indexFilterSet" : false, "parsedQuery" : { "gender" : { "$eq" : "M" } }, "queryHash" : "B4037D3C", "planCacheKey" : "DEAAE17C", "winningPlan" : { "stage" : "PROJECTION_COVERED", "transformBy" : { "user_name" : 1, "_id" : 0 }, "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "gender" : 1, "user_name" : 1 }, "indexName" : "gender_1_user_name_1", "isMultiKey" : false, "multiKeyPaths" : { "gender" : [ ], "user_name" : [ ] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "gender" : [ "[\"M\", \"M\"]" ], "user_name" : [ "[MinKey, MaxKey]" ] } } }, "rejectedPlans" : [ ] }, "serverInfo" : { "host" : "Krishna", "port" : 27017, "version" : "4.2.1", 109 "gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e" }, "ok" : 1 }