我试图检查一个查询,我不确定“nscannedObjectsAllPlans”和“nscannedAllPlans”正在做什么,因为我看到如果我直接在索引字段“purchaseState”上运行查询
我得到了相同的结果扫描项目 “ nscannedObjects ”,“ nscanned ”,“ nscannedObjectsAllPlans ”和“ nscannedAllPlans ”
然而,一旦我将大于400的价格加入查询中 nscannedObjectsAllPlans 现在大于 nscannedObjects 我想知道 nscannedObjectsAllPlans 是否是使用purchase_state索引和purchase_state_Id索引运行计划的扫描对象的总数? 或者只是说明两个指数计划结果中的较大值?
我为pruchase状态添加了一个索引 然后我添加了购买状态和Id的索引
db.toys.ensureIndex({“purchaseState”:1})
db.toys.ensureIndex({“purchaseState”:1,“_ 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"
答案 0 :(得分:2)
MongoDB并行运行不同的可用计划并选择其中最好的计划并记住该类数据集的计划。它还会自动对该集合中每1000次写入的计划进行验证,以确保它们具有正确的计划以进行进一步的类似查询执行。
nscannedObjectsAllPlans意味着当您运行查询并让我们说,它们有两个不同的计划,它显示了计数。
nscannedObjectsAllPlans / nscannedAllPlans没有明确的文档可用。我已经完成了MongoDB course,但也没有解释,但它采用最佳方案的方式,间接给出了nscannedAllPlans的答案。
希望这有帮助!
答案 1 :(得分:2)
当MongoDB执行查询时,它可能会尝试并行执行几个不同的计划,以查看哪个是最佳的。 nscannedAllPlans是所有计划中nscanned的总和,同样适用于nscannedObjectsAllPlans / nscannedObjects。