这个很贵吗?使用 mongodb 时使用 _id 跳过
Is it expensive? when using mongodb skip with _id
我预计这次查询并不昂贵
db.someCollection.find({}).skip(400000).limit(100);
因为,它会被“_id”索引,所以它可以直接使用索引访问文档。
但这可能是错误的。通过关注 mongodb 文档,
http://docs.mongodb.org/manual/reference/method/cursor.skip/
为什么跳过操作很昂贵?
带有大参数的 skip
可能很昂贵,因为 MongoDB 必须查询所有满足 .find
命令的文档,然后跳过其中的 400k。您的文档越大,此操作的成本就越高。
skip
无法利用索引,但您可以按照能够非常有效地执行 一些 查询的方式构建索引。
例如,您可以进行分页查询。考虑 post 的集合,其中 dt
是创建日期:
{
_id: ...
dt: 123321123, // this is timestamp
title: "asdf",
...
}
在这种情况下,如果您想获取下一页对象,您应该使用最后 post 的 dt
来预过滤文档:
db.posts.find({dt: {gt: 123321123}}).sort({dt: 1}).limit(100)
_id
的索引也是 "some kind of" 顺序的,但不能保证。将 _id
视为适合访问随机文档而不是序列的索引。
我预计这次查询并不昂贵
db.someCollection.find({}).skip(400000).limit(100);
因为,它会被“_id”索引,所以它可以直接使用索引访问文档。
但这可能是错误的。通过关注 mongodb 文档, http://docs.mongodb.org/manual/reference/method/cursor.skip/
为什么跳过操作很昂贵?
skip
可能很昂贵,因为 MongoDB 必须查询所有满足 .find
命令的文档,然后跳过其中的 400k。您的文档越大,此操作的成本就越高。
skip
无法利用索引,但您可以按照能够非常有效地执行 一些 查询的方式构建索引。
例如,您可以进行分页查询。考虑 post 的集合,其中 dt
是创建日期:
{
_id: ...
dt: 123321123, // this is timestamp
title: "asdf",
...
}
在这种情况下,如果您想获取下一页对象,您应该使用最后 post 的 dt
来预过滤文档:
db.posts.find({dt: {gt: 123321123}}).sort({dt: 1}).limit(100)
_id
的索引也是 "some kind of" 顺序的,但不能保证。将 _id
视为适合访问随机文档而不是序列的索引。