mongodb查询分页优化
要求不用skip
前提:1.时间倒序排列(自己现在的项目中也是按照时间倒序排列的)
2.每页显示10条数据
int limit = 10;//刚开始点击查询的时候设置十条
查询形式为 db.find(query).sort(time,-1).limit(limit)方式
注:query是查询条件,其中包括了时间段的条件,例如 a=<time<=b的限制
1)记录每一页的第一条数据的时间firstTime
2)记录每一页最后一条数据的时间lastTime
在查询之前判断用户是点击下一页还是上一页,在这里用clickPrePage的值是否为空来判断是否点击上一页
同理用clickNextPage的值是否为空来判断是否点击下一页
//逻辑代码如下
if(notEmpty(clickPrePage){//点击上一页
limit = clickPrePage*10;
查询条件的时间条件设置为>=firstTime
}//end if
if(notEmpty(clickNextPage){//点击下一页
limit = clickNextPage * 10;
查询条件的时间条件设置为<=lastTime
}//end if
代码说明:
比如当前页是第5页,当点击第4页的时候,由于每页要显示十条,所以按照上面的逻辑limit=40,也就是查询40条,取后十条记录显示即可
同理,当点击第6页的时候。此时limit=60,查询60条,取最后十条显示
当然,当用户输入跳转的时候同样的逻辑,比如当前页还是取第五页为例,此时用户要跳转到第100页,那么此时limit=1000,取最后10条显示即可
由于每页显示10条数据,需要从查询的结果中获取10条,所以while循环可以这么写
int index=0;
while(cursor.hasNext()&index<limit){//确保循环十次,让集合list的size=10,把list传到前台,来达到每页显示十条数据的目的
int i = limit-index;
//查询结果放入集合list中,要取查询结果的后10条
if(i<10){
//记录每页第一条数据的时间
if(i==9){
fistTime = db.get("time").toString();
}
//记录每页最后一条数据的时间
if(i==0){
lastTime = db.get("time").toString();
}
list.add(cursor.hasNext().next());
}//end if
index++;
}//end while
缺点:
在跨页跳转时由于不能确定要跳转的页面的前一页的lastTime,所以根据前面设定的limit,需要查询一些不必要的数据, 然后从这些数据取后10条也就是需要的数据来显示,效率上仍有些欠缺。
比如:当前页为currentPage,记录此页的lastTime假设为a,要跳转到currentPage+100页,需要根据currentPage的lastTime来作为查询条件,而没法获取currengPage+99页的数据的lastTime来进一步缩小查询范围.
未完待续
以上方法有不当之处,欢迎批评指正,如果好的方法,希望能交流一下
mongodb查询分页优化的更多相关文章
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案
如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案
- 使用聚集索引和非聚集索引对MySQL分页查询的优化
内容摘录来源:MSSQL123 ,lujun9972.github.io/blog/2018/03/13/如何编写bash-completion-script/ 一.先公布下结论: 1.如果分页排序字 ...
- 记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题
最近有项目反应,在服务器CPU使用较高的时候,我们的事件查询页面非常的慢,查询几条记录竟然要4分钟甚至更长,而且在翻第二页的时候也是要这么多的时间,这肯定是不能接受的,也是让现场用SQLServerP ...
- 【MySQL】分页优化
前段时间由于项目的原因,对一个由于分页而造成性能较差的SQL进行优化,现在将优化过程中学习到关于分页优化的知识跟大家简单分享下. 分页不外乎limit,offset,在这两个关键字中,limit其实不 ...
- 高性能MySQL笔记 第6章 查询性能优化
6.1 为什么查询速度会慢 查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...
- mongodb查询文档
说到查询,我们一般就想起了关系型数据库的查询了,比如:order by(排序).limit(分页).范围查询(大于某个值,小于某个值..,in查询,on查询,like查询等待很多),同样mongodb ...
- mysql笔记03 查询性能优化
查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减 ...
- MySQL 百万级分页优化
MySQL 百万级分页优化 http://www.jb51.net/article/31868.htm 一般刚开始学SQL的时候,会这样写 : , ; 但在数据达到百万级的时候,这样写会慢死 : , ...
- SQL Server查询性能优化——堆表、碎片与索引(二)
本文是对 SQL Server查询性能优化——堆表.碎片与索引(一)的一些总结. 第一:先对 SQL Server查询性能优化——堆表.碎片与索引(一)中的例一的SET STATISTICS IO之 ...
随机推荐
- Android学习笔记:进度条ProgressBar的使用以及与AsyncTask的配合使用
ProgressBar时android用于显示进度的组件.当执行一个比较耗时的操作(如io操作.网络操作等),为了避免界面没有变化让用户体验降低,提供一个进度条可以让用户知道程序还在运行. 一.Pro ...
- android-studio 安装gradle
http://services.gradle.org/distributions 下载需要的gradle 放到C:\Users\Administrator\.gradle\wrapper\dists\ ...
- JVM调优总结(三)-基本垃圾回收算法
可以从不同的的角度去划分垃圾回收算法: 按照基本回收策略分 引用计数(Reference Counting): 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数. ...
- 团队 / Staff_VidaMiaTangoClub_新浪博客
团队 / Staff_VidaMiaTangoClub_新浪博客 团队 / Staff
- CF 319D(Have You Ever Heard About the Word?-模拟)
D. Have You Ever Heard About the Word? time limit per test 6 seconds memory limit per test 256 megab ...
- 监听手机晃动(摇一摇)SensorEventListener
import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; ...
- 开源数据库连接池之Tomcat内置连接池
本篇介绍几种开源数据库连接池,同时重点讲述如何使用Tomcat服务器内置的数据库连接池. 之前的博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式.这样能减少数 ...
- 一个问题:关于类型转换Type Cast(汇编讲解 as 语法)
问题如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ...
- VPS服务器下的centos网卡配置详解……
自动激活网卡 安装了CENTOS 6.X后,每次启动了系统都需要手动激话网卡,以下方法可以在系统启动后自动激活网卡. cat /etc/sysconfig/network-scripts/ifcfg- ...
- 网页 HTML
HTML--超文本标记语言Hyper Text Markup Language. 一,常规标签 (1)格式控制(记忆模型--Word工具栏) <b></b>加粗,<i&g ...