我预计此查询并不昂贵
db.someCollection.find({}).skip(400000).limit(100);
因为,它会被“_id”索引,所以它可以使用索引直接访问文档。
但这可能是错的。通过关注mongodb doc, http://docs.mongodb.org/manual/reference/method/cursor.skip/
为什么跳过操作很贵?
答案 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
视为适合访问随机文档而非序列的索引。