我在Mongo的一个Collection 中有超过30万张唱片.
当我运行这个非常简单的查询时:
db.myCollection.find().limit(5);
只需要几毫秒.
但当我在查询中使用skip时:
db.myCollection.find().skip(200000).limit(5)
它不会归还任何东西...它运行了几分钟,什么也不返回.
如何让它变得更好?
我在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条;