为什么mongodb查询,2条件比1条件慢?

时间:2014-01-15 10:00:37

标签: performance mongodb

我有2个查询:

// query 1
{
"site.$id": ObjectId("52d617b5d8c472274f00004f")
}
// query 2
{
"site.$id": ObjectId("52d617b5d8c472274f00004f"),
"category.$id": ObjectId("52d617c0d8c472274f000076") 
}

有人可以解释为什么第二个查询占用1而第一个查询非常快?

此系列有大约300,000个条目 以下是查询1的解释

db.Product.find({ "site.$id": ObjectId("52d617b5d8c472274f00004f") }).explain()
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 21,
"nscannedObjects" : 279001,
"nscanned" : 279001,
"nscannedObjectsAllPlans" : 279001,
"nscannedAllPlans" : 279001,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 3,
"nChunkSkips" : 0,
"millis" : 545,
"indexBounds" : {

},
"server" : "ip-172-31-9-78:27017"
}

以下是查询2的解释

db.Product.find({ "site.$id": ObjectId("52d617b5d8c472274f00004f"), "category.$id": ObjectId("52d617c0d8c472274f000076") }).explain()
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 279002,
"nscanned" : 279002,
"nscannedObjectsAllPlans" : 279002,
"nscannedAllPlans" : 279002,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 107,
"nChunkSkips" : 0,
"millis" : 1852,
"indexBounds" : {

},
"server" : "ip-172-31-9-78:27017"
}

1 个答案:

答案 0 :(得分:0)

尝试为这些字段创建索引。我认为它会更快地运作..

db.Product.ensureIndex( { "site.$id": 1, "category.$id": 1 } )

您还可以考虑查询中的字段顺序以及索引中的字段顺序。这将有助于http://docs.mongodb.org/manual/tutorial/create-queries-that-ensure-selectivity/