Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does Mongo hint make a query run up to 10 times faster?

Tags:

If I run a mongo query from the shell with explain(), get the name of the index used and then run the same query again, but with hint() specifying the same index to be used - "millis" field from explain plan is decreased significantly

for example

no hint provided:

>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).explain();  {     "cursor" : "BtreeCursor my_super_index",     "nscanned" : 599,     "nscannedObjects" : 587,     "n" : 3,     "millis" : 24,     "nYields" : 0,     "nChunkSkips" : 0,     "isMultiKey" : true,     "indexOnly" : false,     "indexBounds" : { ... } }  

hint provided:

>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).hint("my_super_index").explain();  {     "cursor" : "BtreeCursor my_super_index",     "nscanned" : 599,     "nscannedObjects" : 587,     "n" : 3,     "millis" : 2,     "nYields" : 0,     "nChunkSkips" : 0,     "isMultiKey" : true,     "indexOnly" : false,     "indexBounds" : { ... } }  

The only difference is "millis" field

Does anyone know why is that?

UPDATE: "Selecting which index to use" doesn't explain it, because mongo, as far as I know, selects index for each X (100?) runs, so it should be as fast as with hint next (X-1) runs

like image 816
Eugene Platonov Avatar asked Oct 11 '11 18:10

Eugene Platonov


People also ask

What is MongoDB hint?

hint() method is used to force MongoDB to use a specific index for a query. Syntax: cursor.hint(index) Parameters: Name. Description.

How fast is MongoDB search?

2. How fast are MongoDB queries? Pretty darn fast. Primary key or index queries should take just a few milliseconds.

What makes MongoDB slow?

The slow queries can happen when you do not have proper DB indexes. Indexes support the efficient execution of queries in MongoDB. Without indexes, MongoDB must perform a collection scan, i.e. scan every document in a collection, to select those documents that match the query statement.


2 Answers

Mongo uses an algorithm to determine which index to be used when no hint is provided and then caches the index used for the similar query for next 1000 calls

But whenever you explain a mongo query it will always run the index selection algorithm, thus the explain() with hint will always take less time when compared with explain() without hint.

Similar question was answered here Understanding mongo db explain

like image 66
Global Warrior Avatar answered Sep 27 '22 20:09

Global Warrior


Mongo did the same search both times as you can see from the number of scanned objects. Also you can see that the used index was the same (take a look at the "cursor" entry), both used already your my_super_index index.

"hint" only tells Mongo to use that specific index which it already automatically did in the first query.

The second search was simple faster because all the data was probably already in the cache.

like image 20
StefanMK Avatar answered Sep 27 '22 20:09

StefanMK