mongoDb
hint() method is used to override MongoDB’s default index selection and query
optimization process.
Let’s
say, below students collection has indexes on “first_name”, “last_name” and
“first_name”, “last_name”.
> db.students.getIndexes() [ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "school.students" }, { "v" : 1, "key" : { "last_name" : 1 }, "name" : "last_name_1", "ns" : "school.students" }, { "v" : 1, "key" : { "first_name" : 1 }, "name" : "first_name_1", "ns" : "school.students" }, { "v" : 1, "key" : { "first_name" : 1, "last_name" : 1 }, "name" : "first_name_1_last_name_1", "ns" : "school.students" } ] >
>
>
> db.students.find({"first_name": "first_name1"}).explain() { "cursor" : "BtreeCursor first_name_1", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 1, "nscanned" : 1, "nscannedObjectsAllPlans" : 2, "nscannedAllPlans" : 2, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 1, "nChunkSkips" : 0, "millis" : 285, "indexBounds" : { "first_name" : [ [ "first_name1", "first_name1" ] ] }, "server" : "RENT-MIS-LT3016:27017", "filterSet" : false }
As
you observe, mongoDB uses the index “first_name”. If you want to force mongoDB
to use index on “last_name”, use hint command like below.
> db.students.find({"first_name": "first_name1"}).hint({"last_name":1}).explain() { "cursor" : "BtreeCursor last_name_1", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 10000000, "nscanned" : 10000000, "nscannedObjectsAllPlans" : 10000000, "nscannedAllPlans" : 10000000, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 78147, "nChunkSkips" : 0, "millis" : 32239, "indexBounds" : { "last_name" : [ [ { "$minElement" : 1 }, { "$maxElement" : 1 } ] ] }, "server" : "RENT-MIS-LT3016:27017", "filterSet" : false }
You
can observe above query takes more time than the original one, it is because we
are searching on “first_name” using the index on “last_name”.
If
you want to use default index, then use {natural:1} as hint parameter.
> db.students.find({"first_name": "first_name1"}).hint({$natural:1}).explain() { "cursor" : "BasicCursor", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 10000000, "nscanned" : 10000000, "nscannedObjectsAllPlans" : 10000000, "nscannedAllPlans" : 10000000, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 78125, "nChunkSkips" : 0, "millis" : 5591, "server" : "RENT-MIS-LT3016:27017", "filterSet" : false }
Prevoius Next Home
No comments:
Post a Comment