2

我试图检查一个查询,但我不确定“nscannedObjectsAllPlans”和“nscannedAllPlans”在做什么,因为我看到如果我直接从索引字段“purchaseState”运行查询

对于“ nscannedObjects ”、“ nscanned ”、“ nscannedObjectsAllPlans ”和“ nscannedAllPlans ” ,我得到相同的扫描项目结果

但是,一旦我在查询中添加了大于 400 的价格, nscannedObjectsAllPlans现在大于nscannedObjects 我想知道 nscannedObjectsAllPlans是否是运行带有 purchase_state 索引和 purchase_state_Id 索引的计划的扫描对象的总数?还是只是说明两个指数计划结果中的较大者?

我向购买状态添加了一个索引,然后我在购买状态和 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"
4

2 回答 2

2

MongoDB 并行运行不同的可用计划并选择其中最好的一个,并记住该计划用于那种数据集。它还会自动验证该集合之后每 1000 次写入的计划,以确保它们具有正确的计划以进一步执行类似的查询。

nscannedObjectsAllPlans 意味着当您运行查询并让我们说它们使用两个不同的计划时,它会显示该计数。

nscannedObjectsAllPlans / nscannedAllPlans 没有明确的文档。我已经完成了MongoDB 课程,它也没有解释,但它选择最佳计划的方式,间接地给出了 nscannedAllPlans 的答案。

希望这可以帮助!

于 2012-12-19T20:08:32.790 回答
2

当 MongoDB 执行查询时,它可能会尝试并行执行几个不同的计划,看看哪个是最好的。nscannedAllPlans 是所有计划中 nscanned 的总和,同样适用于 nscannedObjectsAllPlans/nscannedObjects。

于 2012-12-19T20:31:48.167 回答