现在参与一个项目的开发,需要用java查询mongodb数据库,在这里分页用的skip sort 和limit结合,查询语句如下(已经在相关字段建立索引)

DBCursor cursor = collection.find(query).skip((skip - 1) * PAGESIZE).sort(new BasicDBObject("starttime", -1)).limit(PAGESIZE);//PAGESIZE=10

由于分页,这里需获取符合条件的总数 语句如下

int count = cursor.count()

根据count和PAGESIZE的两个数据来分页。由于带条件的count()方法执行起来特别耗时,我用二百万的数据测试了一下,cursor.count()就耗时6.5s多,mongodb权威指南这不书也指出count()方法随着查询条件越多,执行速度越慢。

现在问题出来了,现在模拟一下操作

1)点击查询执行查询方法queryLists()(这是我代码中的方法名)并执行耗时的count()方法获取符合条件的数量,进行分页

2)点击下一页或者点击某一页时,同样执行queryLists()方法,同样也需要执行该方法体中的count()方法,这样count方法又耗去一部分时间

显然用户体验不是很好,每次点击查询时就很耗时了,点击下一页或者某一页时同样还得等待,这样的话谁都受不了

下面是我的优化方案

1)设置一个变量clickQuery,当用户点击查询按钮时 clickQuer赋值为0.当点击下一页或者上一页或者跳转页面时clickQuery=1.

也就是说用clickQuery来判断用户是否点击查询按钮

2)既然点击查询时已经获取了count,何必再点击下一页时在执行cursor.count()方法呢?所以我的做法就是把点击查询的时候获取的count保存起来

当用户点击下一页的时候,直接读取已经保存的count,而不是执行耗时的cursor.count()方法

方法优点:

点击下一页或者某一页或者跳转页面时,由于已经保存过查询时的count,所以速度很快

方法缺点:

用户点击查询按钮时,因为要执行cursor.count方法,所以还是很慢。

代码实现如下

int count = 0;
if (click.equals("0")) {// 如果点击查询count = cursor.count();//获取符合条件的数量// 序列化,保存count2Seria.serializable(new BtnClick(count), Seria.ACTIVITY_COUNT_FILE);System.out.println("点击查询");//Seria是我自己定义的一个类,来序列化数据
} else {// 如果点击下一页或者跳转页// 读取序列化信息BtnClick btnClick = Seria.reverseSer(Seria.ACTIVITY_COUNT_FILE);count= btnClick.getCount();System.out.println("点击下一页");
}
///分页处理略
 /*** 序列化*/public static void serializable(BtnClick btnClick,String file) {try {File serFile = new File(file);// 判断序列化文件是否存在, 不存在则创建if (!serFile.exists())serFile.createNewFile();//打开serFile的输出流FileOutputStream fos = new FileOutputStream(serFile);ObjectOutputStream oos = new ObjectOutputStream(fos);// 将上下文对象写到序列化文件中oos.writeObject(btnClick);oos.close();fos.close();} catch (Exception e) {e.printStackTrace();}}/*** 反序列化*/public static BtnClick reverseSer(String file) {File serFile = new File(file);BtnClick btnClick = null;if (!serFile.exists())return null;try {// 得到文件输入流FileInputStream fis = new FileInputStream(serFile);ObjectInputStream ois = new ObjectInputStream(fis);// 设置ContextHolder的DownloadContextbtnClick = (BtnClick) ois.readObject();ois.close();fis.close();} catch (Exception e) {e.printStackTrace();}return btnClick;}

我的问题:因为用skip方法查询大量数据的时候速度慢,不知道有什么方法可以优化一下,mongodb权威指南的那个方法,只适合一页一页的调整而不适合跨页跳转,所以大家如果有好的查询方案,可以和小弟在此说一下,谢谢。

同样以上方法如有不当之处,欢迎批评指正

mongodb分页优化相关推荐

  1. mongodb查询分页优化

    mongodb查询分页优化 转自:https://blog.csdn.net/chunqiuwei/article/details/11669885 项目中需要用mongodb来进行数据测存储和查询, ...

  2. MongoDB 分页查询的方法及性能

    这篇文章着重的讲讲MongoDB的分页查询 传统的SQL分页 传统的sql分页,所有的方案几乎是绕不开 row_number的,对于需要各种排序,复杂查询的场景,row_number就是杀手锏.另外, ...

  3. ajax mysql搜索_京东分页优化之Mysql优化实践

    当你和别人都能实现一个某个功能,这时候区分你们能力的不是谁干活多少,而是谁能写出效率更高的代码.比如显示一个订单列表它不仅仅是写一条SELECT SQL那么简单,我们还需要很清楚的知道这条SQL他大概 ...

  4. php超大树形分页,PHP+MySql千万级数据limit分页优化方案

    PHP+MySql千万级数据limit分页优化方案 1年前 阅读 2750 评论 0 喜欢 0 ### 原因 徒弟突然有个需求,就是他发现limit分页,页数越大之后,mysql的消耗越大,查询时间越 ...

  5. MySQL 分页优化中的 “ INNER JOIN方式优化分页算法 ” 到底在什么情况下会生效?...

    最近无意间看到一个 MySQL 分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的方案.因为现实中很多情况都不是固定不变的,能总结出来通用性的做法或者说是规律,是要考虑非常多的 ...

  6. MySQL 分页优化中的 “ INNER JOIN方式优化分页算法 ” 到底在什么情况下会生效?

    最近无意间看到一个 MySQL 分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的方案.因为现实中很多情况都不是固定不变的,能总结出来通用性的做法或者说是规律,是要考虑非常多的 ...

  7. mysql limit 越大越慢_mysql 优化之14:php mysql limit 分页优化,页面值越大查询越慢...

    php mysql limit 分页优化,页面越大查询越慢 一.测试前言 当前测试表:nodes_hierarchy目前数据量为20多万 程序分页中我们经常使用的核心sql语句select * fro ...

  8. 解决Mysql数据量大的时候 分页优化(使用limit)的问题

    解决Mysql数据量大的时候 分页优化(使用limit)的问题 参考文章: (1)解决Mysql数据量大的时候 分页优化(使用limit)的问题 (2)https://www.cnblogs.com/ ...

  9. MongoDB索引优化

    MongoDB 索引优化 1. 一图看懂索引原理 2. 查看执行计划 3. 如何建索引 3. 索引的优化 4. 索引的选择机制 5. 优化实践 country_themes 优化 wallpapers ...

  10. 【MySQL性能优化系列】百万数据limit分页优化

    背景 众所周知,在使用limit分页过程中,随着前端传过来的PageSize越来越大,查询速度会越来越慢.那有什么优化的办法呢? 本文将通过百万数据表进行演示和优化, 欲知详情,请看下文分解. lim ...

最新文章

  1. 边缘计算 — 与车联网
  2. 基于FPGA的bubble游戏开发
  3. 新四则运算 合作完成
  4. 二叉线索树的先序、中序、后序的线索化及其遍历
  5. php magento 开发,magento 2模块开发实例helloworld模块 hello world 程序 c语言hello world代码 c语言hello worl...
  6. 蚂蚁森林用户须知_公益传播视角下“蚂蚁森林”的用户使用行为研究
  7. php 读取本地excel文件,PHP读取Excel文件的简单示例
  8. Sketch for mac v78 矢量绘图软件
  9. natapp做一个内网穿透
  10. 【20140205】曼昆著《经济学原理》读书笔记
  11. python 百度人脸 sdk_深更半夜实现python百度api人脸识别
  12. DDR中的ODT功能详解及波形对比
  13. Sass和Scss的区别
  14. QT之Tableview
  15. 【渝粤教育】广东开放大学 搜索引擎优化SEO 形成性考核
  16. 基于10代硬件下的HTPC/NAS一体打造全记录
  17. 设计模式-策略模式,模板方法模式练习
  18. 【FiddlerScript】利用Fiddler中的FiddlerScript解除7K7K小游戏的防沉迷
  19. 防静电手环在计算机中的功能,防静电手环原理
  20. 东航航空货运系统(四)功能模块_制单管理_1

热门文章

  1. java被oracle收购,sun被oracle收购了,openoffice和virtualbox会不会死?
  2. javascript:js+css实现加载特效
  3. HttpClient、HttpURLConnection、OKHttp和Volley
  4. java-Aspose.Words的使用(Office文档转为PDF)
  5. 1.空间中直线交点坐标问题,2.已知球面三点求球心问题以及Matlab实现
  6. C++调用tensorflow训练好的SSD物体检测模型-opencv3.4.3
  7. 交叉编译 -sh: ./xxx: not found 的问题
  8. javascript跨域、iframe跨域访问
  9. 如何在Delphi TImageList 中使用 透明 png 图标
  10. csc.exe的使用