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之 ...
随机推荐
- 15-UIKit(view布局、Autoresizing)
目录: 1. 纯代码布局 2. 在View中进行代码布局 3. Autoresizing 回到顶部 1. 纯代码布局 纯代码布局分VC下和V下 [MX1-layout-code] 在VC下覆盖view ...
- wince下GetManifestResourceStream得到的Stream是null的解决
问题的引入 在编程过程中遇到下面这样一个问题: 有这样一个方法: public static AlphaImage CreateFromResource(string imageResourceNam ...
- debian安装jdk8
1.官方下载java想安装的JAVA版本: http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.比如说,常安装的J ...
- 动态网页爬取例子(WebCollector+selenium+phantomjs)
目标:动态网页爬取 说明:这里的动态网页指几种可能:1)需要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成,如一个html里有<div id="test" ...
- MySQL 修改字段类型或长度
mysql> alter table 表名 modify column 字段名 类型;例如 数据库中address表 city字段是varchar(30) 修改类型可以用(谨慎修改类型,可能会导 ...
- APEC计划指引我们前进:云计算服务将上升
APEC纲领指引我们前进:云计算服务业必将兴起 这是APEC领导人的合影: 这次APEC会议通过了<北京纲领>和<亚太伙伴关系声明>,进一步明白了亚太地区经济合作的发展方向.目 ...
- textarea内容有换行时存入数据库丢失问题的解决 (转载)
http://blog.csdn.net/zhang_j_h/article/details/44563167 存入: function GetInputData(id, cmd) { var pos ...
- 金额的计算BigDecimal类
金额的计算BigDecimal类 double d = 9.84; double d2 = 1.22; //注意需要使用BigDecimal(String val)构造方法 BigDecimal bi ...
- 【milonga】什么意思_英语milonga在线翻译_有道词典
[milonga]什么意思_英语milonga在线翻译_有道词典 milonga 网络释义英英释义 米隆加 本届探戈艺术节表演最受观众欢迎的是热情欢快的米隆加(Milonga)舞曲探戈,为了吸引年 ...
- 免解压版的Mysql的启动脚本,并且执行导入(windows)
@echo off rem ################### set MYSQL_VERSION=mysql-5.5.32-win32 set LOCK=wot.lock rem ####### ...