我试图检查一个查询,但我不确定“nscanndobjectsallplans”和“nscanndallplans”在做什么,因为我看到如果我直接从索引字段“purchasestate”运行一个查询
我得到相同的结果扫描项目
“nscannedobjects”、“nscanned”、“nscannedobjectsallplans”和“nscannedallplans”
但是,一旦我在查询中添加了大于400的价格,
nscanndobjectsallplans现在大于nscanndobjects
我想知道nscannedobjectsallplans是否是运行带有购买状态索引和购买状态id索引的计划的扫描对象总数?
或者只是说明两个指数计划结果中较大的一个??
我给普鲁查斯州增加了一个索引
然后我添加了一个关于购买状态和id的索引
db.toys.ensureIndex({“purchaseState”:1})
db.toys.ensureIndex({“purchaseState”:1,“\u id”:1})
**db.toys.find({"purchaseState" : "NY"}).pretty().explain()**
"cursor" : "BtreeCursor purchaseState_1",
"isMultiKey" : false,
"n" : 1596,
"nscannedObjects" : 1596,
"nscanned" : 1596,
"nscannedObjectsAllPlans" : 1596,
"nscannedAllPlans" : 1596,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 3,
"indexBounds" : {
"purchaseState" : [
[
"NY",
"NY"
]
]
},
"server" : "XXXXXXX:27017"
**db.toys.find({"purchaseState" : "NY", "price": { $gt : 400 }}).pretty().explain()**
"cursor" : "BtreeCursor purchaseState_1",
"isMultiKey" : false,
"n" : 1423,
"nscannedObjects" : 1596,
"nscanned" : 1596,
"nscannedObjectsAllPlans" : 1808,
"nscannedAllPlans" : 1808,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 10,
"indexBounds" : {
"purchaseState" : [
[
"NY",
"NY"
]
]
},
"server" : "XXXXXXX:27017"
最佳答案
MongoDB并行运行不同的可用计划,并选择其中最好的一个,并记住这类数据集的计划。它还自动地对该集合上的每1000个写操作执行一次计划值,以确保它们对进一步类似的查询执行有正确的计划。
nscannedobjectsallplans意味着,当您运行一个查询时,让我们说,它们与两个不同的计划一起运行,它会显示该计数。
对于nscanndobjectsallplans/nscanndallplans没有明确的文档。我已经经历了MongoDB course的过程,这里也没有解释,但是它选择最佳计划的方式,间接地给出了nscannelplan的答案。
希望这有帮助!