在mongodb中慢速分页logging大量的logging

我在Mongo的一个集合中有超过30万条logging。

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

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

这只需要几个毫秒。

但是,当我在查询中使用跳过:

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

它不会返回任何东西…它运行几分钟,并不返回任何东西。

如何使它更好?

从MongoDB 文档 :

寻呼成本

不幸的是,跳过可能(非常)昂贵,并且要求服务器从集合的开始处或索引处走到偏移/跳过位置,才能开始返回数据页面(限制)。 随着页面数量的增加,跳过将会变得越来越慢,并且CPU密集度越来越高,并且可能IO容量越大,集合越大。

基于范围的分页提供更好的索引使用,但不允许您轻松地跳转到特定的页面。

你必须问自己一个问题:你多长时间需要4万页? 也看到这篇文章;

解决这个问题的一种方法是,如果你有大量的文档,并且按照sorting的顺序显示它们(我不确定如果不是, skip是多么有用),就是使用你正在sorting的键来select结果的下一页。

所以,如果你开始

 db.myCollection.find().limit(100).sort(created_date:true); 

然后将由光标返回的最后一个文档的创builddate提取到variablesmax_created_date_from_last_result ,您可以使用效率更高的(假定您在created_date上具有索引)查询下一页

 db.myCollection.find({created_date : { $gt : max_created_date_from_last_result } }).limit(100).sort(created_date:true);