非常高" nscanned"值"更新"查询 - 似乎高于所有索引中所有条目的总和

时间:2014-09-22 13:12:17

标签: performance mongodb indices

我偶尔会在更新查询中获得非常高的'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 - 这是一种已知的指数更新错误吗?

1 个答案:

答案 0 :(得分:2)

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