这个很贵吗?当使用mongodb跳过_id时

时间:2015-03-26 07:00:16

标签: performance mongodb indexing

我预计此查询并不昂贵

db.someCollection.find({}).skip(400000).limit(100);

因为,它会被“_id”索引,所以它可以使用索引直接访问文档。

但这可能是错的。通过关注mongodb doc, http://docs.mongodb.org/manual/reference/method/cursor.skip/

为什么跳过操作很贵?

1 个答案:

答案 0 :(得分:0)

带有大参数的

skip可能很昂贵,因为MongoDB必须查询满足.find命令的所有文档,然后跳过400k。您的文档大小越大,此操作的成本就越高。

skip无法利用索引,但您可以通过非常有效地某些查询的方式构建索引。

例如,您可以使用分页进行查询。考虑收集帖子,其中dt是创建日期:

{
 _id: ...
 dt: 123321123, // this is timestamp
 title: "asdf",
 ...
}

在这种情况下,如果您想要获取对象的下一页,则应使用上一篇文章的dt预过滤文档:

db.posts.find({dt: {gt: 123321123}}).sort({dt: 1}).limit(100)

_id的索引也是"某种"顺序,但不保证。将_id视为适合访问随机文档而非序列的索引。