我在偶尔的更新查询中得到非常高的“nscanned”数字,而“nscannedObjects”相对较低。
我从 mongodb 日志中获取这些数字,作为慢查询自动记录的一部分(这些更新需要 100 毫秒到 500 毫秒之间的任何时间)。
更新后的集合有 198K 项,大小刚好超过 100MB。
它有许多不同的字段(超过 30 个),以及这些字段及其组合的 31 个索引。

这是 MongoDB.log 中的完整条目 - 包括查询和结果:



当我使用 { _id: ObjectId('53d1365dad547f12b0f31afe') } 进行输入时,我希望 MongoDB 直接命中 '_id' 索引,因此 nscanned = 1

我无法提供确切的查询和集合详细信息,但这是我正在做的一个示例:

示例文档:

{"_id" : ObjectId("53d1365dad547f12b0f31afe"),
 "field1" : "val1",
 "field2" : "val2",
 "field3" : "val3",
 ...
 "field45" : "val45",
}

更新查询:
mycollection.update({"_id" : ObjectId("53d1365dad547f12b0f31afe")},
                    {"$set" : {"field1" : "new_val1",
                               "field2" : "new_val2",
                               "field3" : "new_val3",
                               ...
                               "field45" : "new_val45"}})

索引存在于 mycollection、“field1”、“field2”...“field31”上。

如果我进行计算,那么即使这个查询会扫描 31 个索引中的每一个中的每个条目,我预计只会得到 6,138,000 左右的“nscanned”,因此上述内容毫无意义!

我正在使用 MongoDB 2.6.4 - 这是索引更新的任何已知错误吗?

最佳答案

这是 MongoDB 2.6.4 中的一个错误,并在 2.6.5(尚未发布)中修复。 nscannednscannedObjects 变量在某些情况下未初始化,导致这些随机值。有关详细信息,请参阅 SERVER-15106commit to fix it

关于performance - "nscanned"查询上的 "update"值非常高 - 似乎高于所有索引中所有条目的总和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25975027/

10-16 08:39