mongodb分页优化

转载 2015年07月07日 18:48:27

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

  1. 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方法,所以还是很慢。


代码实现如下

  1. int count = 0;  
  2. if (click.equals("0")) {// 如果点击查询  
  3.     count = cursor.count();//获取符合条件的数量  
  4.     // 序列化,保存count2  
  5.    Seria.serializable(new BtnClick(count), Seria.ACTIVITY_COUNT_FILE);  
  6.    System.out.println("点击查询");//Seria是我自己定义的一个类,来序列化数据  
  7. else {// 如果点击下一页或者跳转页  
  8.   // 读取序列化信息  
  9.   BtnClick btnClick = Seria.reverseSer(Seria.ACTIVITY_COUNT_FILE);  
  10.   count= btnClick.getCount();  
  11.    System.out.println("点击下一页");  
  12. }  
  13. ///分页处理略  


  1. /** 
  2.  * 序列化 
  3.  */  
  4. public static void serializable(BtnClick btnClick,String file) {  
  5.     try {  
  6.           
  7.         File serFile = new File(file);  
  8.         // 判断序列化文件是否存在, 不存在则创建  
  9.         if (!serFile.exists())  
  10.             serFile.createNewFile();  
  11.         //打开serFile的输出流  
  12.         FileOutputStream fos = new FileOutputStream(serFile);  
  13.         ObjectOutputStream oos = new ObjectOutputStream(fos);  
  14.         // 将上下文对象写到序列化文件中  
  15.         oos.writeObject(btnClick);  
  16.         oos.close();  
  17.         fos.close();  
  18.     } catch (Exception e) {  
  19.         e.printStackTrace();  
  20.     }  
  21. }  
  22.   
  23. /** 
  24.  * 反序列化 
  25.  */  
  26. public static BtnClick reverseSer(String file) {  
  27.     File serFile = new File(file);  
  28.     BtnClick btnClick = null;  
  29.     if (!serFile.exists())  
  30.         return null;  
  31.     try {  
  32.         // 得到文件输入流  
  33.         FileInputStream fis = new FileInputStream(serFile);  
  34.         ObjectInputStream ois = new ObjectInputStream(fis);  
  35.         // 设置ContextHolder的DownloadContext  
  36.         btnClick = (BtnClick) ois.readObject();  
  37.         ois.close();  
  38.         fis.close();  
  39.     } catch (Exception e) {  
  40.         e.printStackTrace();  
  41.     }  
  42.   
  43.     return btnClick;  
  44. }  


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

MongoDB 性能优化之分页查询

最常见的分页采用的是skip+limit这种组合方式,这种方式对付小数据倒也可以,但是对付上几百上千万的大数据,只能力不从心。通过如下思路改善,可以大大提高查询速度:条件查询+排序+限制返回记录。边查...
  • tianwei7518
  • tianwei7518
  • 2015年03月19日 21:39
  • 9100

mongodb查询分页优化(二)

项目中需要用mongodb来进行数据测存储和查询,其中涉及到分页:分页的要求如下 1)每页显示10条 由于数据量太大,cursor.count()获取的符合条件的数据量也很大,导致分页得分好几万页,...
  • chunqiuwei
  • chunqiuwei
  • 2013年09月14日 08:49
  • 15093

mongodb系列之五:java分页优化

转载自:http://blog.csdn.net/maosijunzi/article/details/42101041 前面我们提到过,大数据量分页时,skip如果跳过大量的数据会很慢,这里针...
  • lkx94
  • lkx94
  • 2015年04月12日 21:00
  • 404

mongodb查询分页优化

避免使用skip+limit的方式 前提:1.时间倒序排列(自己现在的项目中也是按照时间倒序排列的)       2.每页显示10条数据 int limit = 10;//刚开始点击查询的时候设置...
  • chunqiuwei
  • chunqiuwei
  • 2013年09月09日 13:55
  • 7466

mongodb-利用游标实现分页

游标不是查询结果,而是查询的返回资源,或者接口,通过这个接口,可以逐条读取数据。 声明游标: var cursor =  db.collectioName.find(query,project...
  • chuan442616909
  • chuan442616909
  • 2017年02月28日 14:55
  • 199

Spring Data 与MongoDB 集成五:操作篇(分页)

本文转载至:http://blog.csdn.net/congcong68/article/details/47624221 一.简介        SpringData  ...
  • zhouzhiwengang
  • zhouzhiwengang
  • 2016年11月09日 14:30
  • 3988

java操作mongodb(分页优化)

前面我们提到过,大数据量分页时,skip如果跳过大量的数据会很慢,这里针对这一情况,我们优化一下分页。 看代码: /** * 大数据量数据分页优化 * @param page * @par...
  • maosijunzi
  • maosijunzi
  • 2014年12月23日 12:08
  • 10337

Springmvc 应用Mongodb分页实现

spring mongodb mongoTemplate 分页
  • chunqiuwei
  • chunqiuwei
  • 2013年12月07日 15:56
  • 15433

php mongodb实现分页操作

最近在用php写后台管理网站,改进功能时想到数据显示,实现的分页的功能显示,单纯用php+mongodb实现。代码如图: ...
  • qq_16558621
  • qq_16558621
  • 2015年10月21日 17:28
  • 950

mongoDB管道使用-去重分页查询

db.iot_run_record_hist.aggregate([ { "$match" : {"runStatus":{"$in":[2 , 10 , 18 , 8 , 9 , 1...
  • hunter542
  • hunter542
  • 2016年11月20日 18:06
  • 569
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mongodb分页优化
举报原因:
原因补充:

(最多只允许输入30个字)