我在Mongo的一个Collection 中有超过30万张唱片.

当我运行这个非常简单的查询时:

db.myCollection.find().limit(5);

只需要几毫秒.

但当我在查询中使用skip时:

db.myCollection.find().skip(200000).limit(5)

它不会归还任何东西...它运行了几分钟,什么也不返回.

如何让它变得更好?

推荐答案

来自MongoDB documentation:

Paging Costs

不幸的是,skip可能(非常)昂贵,需要服务器从集合或索引的开始走到offset/skip位置,然后才能开始返回数据页(limit).随着页数的增加,skip将变得更慢、更占用cpu,并且可能会受到IO的限制,集合也会更大.

基于范围的分页可以更好地使用索引,但不允许轻松跳转到特定页面.

你必须问自己一个问题:你多久需要40000页?另见this条;

Mongodb相关问答推荐

Go mongo-驱动程序测试,FindOne未根据给定的筛选器返回正确结果

在单个mongo文档中组合数组与聚合

如何将数组$拉到对象数组下

Mongo,通过 Lookup 计算多个文档中数组中的项目

MongoDB 根据最新日期查询多个不同的值

判断对象数组中的值是否存在golang

(MongoDB)在同一管道中结合联合和交集

使用名为 Object 键的 uuid 创建 mongodb 文档

使用 homebrew 和 Xcode 8.1.1 安装 Mongodb 失败

MongoDB C# 驱动程序 - 如何将 _id 存储为 ObjectId 但映射到字符串 Id 属性?

什么是 Mongoose (Nodejs) 复数规则?

使用 brew upgrade Mongo update from 3.4 to 4.0 报错:在try 升级到 4.0 之前,数据文件需要完全升级到 3.6 版

Mongoose Schema vs Mongo Validator

MongoDB:多个 $elemMatch

使用 MongoDB 进行嵌套分组

如何从 node.js 以编程方式执行 mongodump 命令?

mongodb nodejs - 转换圆形 struct

Spring Data MongoDB 中的独特之处

在 Mongo 中,$near 和 $nearSphere 有什么区别?

按 id 删除记录?