2012-09-20 107 views
27

我开了查询,并试图解释它蒙戈控制台上,得到了了解蒙戈DB解释

"isMultiKey" : true, 
"n" : 8, 
"nscannedObjects" : 17272, 
"nscanned" : 17272, 
"nscannedObjectsAllPlans" : 21836, 
"nscannedAllPlans" : 21836, 
"scanAndOrder" : true, 
"indexOnly" : false, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"millis" : 184, 

大部分的东西都在http://www.mongodb.org/display/DOCS/Explain解释,但我不明白什么呢nscannedObjectsAllPlans,nscannedAllPlans手段。谁能帮忙?

感谢

回答

23

nscanned,并为获奖计划nscannedObjects报告结果。

nscannedAllPlansnscannedObjectsAllPlans报告结果对所有计划

例如:

>t = db.jstests_explainb; 
>t.drop(); 

>t.ensureIndex({ a:1, b:1 }); 
>t.ensureIndex({ b:1, a:1 }); 

>t.save({ a:0, b:1 }); 
>t.save({ a:1, b:0 }); 

>t.find({ a:{ $gte:0 }, b:{ $gte:0 } }).explain(true); 
{ 
    "cursor": "BtreeCursor a_1_b_1", 
    "isMultiKey": false, 
    "n": 2, 
    "nscannedObjects": 2, 
    "nscanned": 2, 
    "nscannedObjectsAllPlans": 6, 
    "nscannedAllPlans": 6, 
    "scanAndOrder": false, 
    "indexOnly": false, 
    "nYields": 0, 
    "nChunkSkips": 0, 
    "millis": 2, 
... 
} 
+0

所以我应该担心如果nscannedObjectsAllPlans,nscannedAllPlans是给较大的值,而nscanned仍然在可接受的范围内? –

+0

我不这么认为 - 我相信只有当explain()被调用时,它才会首先执行其他计划。 – Konklone

+3

运行多个计划基本上是MongoDB如何决定应该使用哪个查询计划。它执行第一次运行查询时可并行使用的所有计划,然后在数据查询或更改数据后定期执行。一旦完成,它会将其缓存为使用计划,取消其他计划,并将使用该计划,直到下一次决定刷新计划。 –