我有一个表格查询
db.coll.find({x: {$in: ['foo', 'bar', 'baz']}).sort({_id:-1}).limit(LIMIT)
“x”是单个 ObjectId 字段,_id 也是一个 ObjectId。有一个索引 {x:1, _id:-1}。此查询应该从#SERVER-5063到达快速路径。
它在大多数情况下都会这样做,除了一些罕见的情况下似乎执行了全表扫描 - 这些查询的配置文件条目显示 nscanned 略高于所有匹配文档的计数{x: {$in: ['foo', 'bar', 'baz']}}
。这通常比预期情况下查询扫描的数量高出大约 3 个数量级。
该集合的编写量很大,所以我的第一个猜测是查询优化器可能正在重试各种查询计划,包括{_id:1}
索引,但即使在添加之后峰值仍然存在.hint({x:1, _id:-1})
,所以我不确定这里发生了什么。
谁能解释偶尔扫描与查询匹配的所有文档以及如何防止它?
编辑:发生在 MongoDB 2.4.4