我偶尔会在更新查询中获得非常高的'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 - 这是一种已知的指数更新错误吗?
答案 0 :(得分:2)
它是MongoDB 2.6.4中的一个错误,并在2.6.5 (尚未发布)中修复。在某些情况下,nscanned
和nscannedObjects
变量未初始化,从而产生这些随机值。有关详细信息,请参阅SERVER-15106和commit to fix it。