在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);