Mongodb分页优化
来源:互联网 发布:硬笔入门字帖 知乎 编辑:程序博客网 时间:2024/05/20 08:02
mongodb分页优化
现在参与一个项目的开发,需要用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();//获取符合条件的数量 // 序列化,保存count2 Seria.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的DownloadContext btnClick = (BtnClick) ois.readObject();ois.close();fis.close();} catch (Exception e) {e.printStackTrace();}return btnClick;}
我的问题:因为用skip方法查询大量数据的时候速度慢,不知道有什么方法可以优化一下,mongodb权威指南的那个方法,只适合一页一页的调整而不适合跨页跳转,所以大家如果有好的查询方案,可以和小弟在此说一下,谢谢。
- mongodb分页优化
- mongodb查询分页优化
- java MongoDB分页优化
- Mongodb分页优化
- mongodb分页优化
- mongodb查询分页优化
- mongodb查询分页优化(二)
- java操作mongodb(分页优化)
- mongodb查询分页优化(二)
- java操作mongodb(分页优化)
- MongoDB 性能优化之分页查询
- mongodb系列之五:java分页优化
- Mongodb 分页
- MongoDB 优化
- mongodb优化
- mongodb 优化
- mongodb优化
- MongoDB优化
- Princeton Algorithms: Part 2 [week 5: Substring Search]
- C++的try_catch异常
- 华尔街纪事丨中国人在美国买房的那些事儿
- XMemcached使用
- 陌陌流行,因为异乡人的渴望?
- Mongodb分页优化
- C++虚函数访问权限的改变
- 如何传递二维数组
- secureCRT 不识别 键盘输入
- 福建省25名“老赖”因恶意欠薪 被判处刑罚
- 【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法
- Codeforces #282 div2 ABC
- 关于如何在myeclipse8.5中配置tmocat7的问题
- redis存储系统