mongodb php skip,MongoDB不使用skip做分页

本文探讨了在大数据场景下,如何避免MySQL和MongoDB使用skip进行分页的性能瓶颈,提倡通过排序和查询规则调整实现高效分页,介绍了通过日期字段进行渐进式查询的方法,以及应对数据重复和非严格分页需求的技巧。
摘要由CSDN通过智能技术生成

mysql  可以借鉴的思想

MongoDB不使用skip做分页

使用Skip和limit可以如下做数据分页:Code: page1 = db.things.find().limit(20)

page2 = db.things.find().skip(20).limit(20)

page3 = db.things.find().skip(40).limit(20)

当数据量很小时,这样做分页完全没有问题。但是当数据量很大时,skip操作会变的很慢,应该避免使用。(不止是mongoDb会这样,大部分数据库都是。)可以通过改变查询文档的规则来达到分页效果,避免使用skip来跳过大量的数据。(通过计算,得到下次查询应该从什么地方开始)

以下演示如何通过改变查询规则来避免使用skip。如果有以下数据:Code: {'date':'2011-07-05 09:53:00'}

{'date':'2011-07-05 09:53:01'}

{'date':'2011-07-05 09:53:02'}

...

{'date':'2011-07-05 09:54:00'}

则数据库的第一页可以这样获得:Code: page1 = db.xx.find().sort('date',1).limit(10)

然后通过遍历,展示,并且获得最后一个数据:Code: var latest = null;

while (page1.hasNext()) {

latest = page1.next();

display(latest);

}

现在,通过获得的最后一个日期的数据,可以做下一个查询:Code: var page2 = db.xx.find({"date" : {"$gt" : latest.date}});

page2.sort({"date" : 1}).limit(10);

以次类推,可以一直获得到最后一个的分页。

当然,这里展示的只是一个理想的情况,事实上,可能分页的时候,有很多值的数值都是一样的,例如:Code: {'date':'2011-07-05 09:53:00'}

{'date':'2011-07-05 09:53:01'}

{'date':'2011-07-05 09:53:01'}

{'date':'2011-07-05 09:53:01'}

{'date':'2011-07-05 09:53:01'}

{'date':'2011-07-05 09:53:01'}

{'date':'2011-07-05 09:53:02'}

{'date':'2011-07-05 09:53:03'}

{'date':'2011-07-05 09:53:04'}

...

{'date':'2011-07-05 09:54:00'}

在这个例子中,如果第一个分页落在{'date':'2011-07-05 09:53:01'}附近的话,就会有5条重复的(极端情况下,可能有非常多,例如好几百条一样的键值),这样在调用{"$gt" : latest.date}时,可能会把上一页的尾数据也给包含进来了。在这种情况下,就需要使用一些别的field来辅助分页,或者转回采用skip,或者如果你的分页不是特别的严格,可以忽略这种情况。(例如mop,天涯首页那种,每页有好几百页帖子,每一秒每一页都不一样。)

用where+limt是最快的

mongo是用skip翻页,这个非常慢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值