performance – “update”查询的“nscanned”值非常高 – 似乎高于所有索引中所有条目的总和

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

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

2014-09-22T11:55:22.507+0000 [conn45755] update mydatabase.mycollection query: { _id: ObjectId(’53d1365dad547f12b0f31afe’) } update: { ….} nscanned:1702130278 nscannedObjects:121 nMatched:1 nModified:1 keyUpdates:4 numYields:0 locks(micros) w:310293 310ms

当我使用{_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(尚未发布)中修复. nscanned和nscannedObjects变量在某些情况下未初始化,从而导致这些随机值.有关详细信息,请参阅SERVER-15106commit to fix it.

转载注明原文:performance – “update”查询的“nscanned”值非常高 – 似乎高于所有索引中所有条目的总和 - 代码日志