mongodb查询分页优化(二)

转载 2015年07月07日 18:53:24

项目中需要用mongodb来进行数据测存储和查询,其中涉及到分页:分页的要求如下

1)每页显示10条

由于数据量太大,cursor.count()获取的符合条件的数据量也很大,导致分页得分好几万页,同时在项目中用到了skip加limit的分页方式,使得性能变慢

所以通过讨论使用了一下措施.即要求2

2)最多分5000页,(其实用户也不可能从第一页一页一页的翻到6000页去,一般情况下翻个几十页,查不到自己所要的数据,都会重新输入查询条件来再进行一次筛选)


经过前面的博客讨论,可以知道分页过程中用cursor.count()获取符合条件的条数是很耗时的,在几千万条数据的压力下,基本上点击查询等待时间不是一般的慢.


结合要求2,现在我们的分页思路可以进行一下改动,思路的伪代码如下

1)分页查询语句为:

   

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

2)既然限制了最大页数,那么可以知道skip的最大值就等于最大页数*每页显示的条数,在这里是10*5000=50000条.那么核心思路也就由此而出

int  count = 0;

if(查询的数量>50000){

  count = 5000;

}else{

   count =实际的数量

}

通过if条件可知,我们需要做这么一个判断:判断符合条件的数据量的大小是否大于50000

所以,在分页查询语句的后面可以添加这样的一句代码


  1. DBCursor cursor2 = collection.find(query).skip(maxPage * PAGESIZE).limit(1);//maxPage=最大页数,在这里是5000  

这句代码思路很简单,就只直接skip跳过50000条数据进行查询,如果能查到结果,就说明查询的数据量大于50000条

所以上面的代码改动如下

int count = 0;

if(cursor2.hasNext()){//说明数据量大于50000

   count = 50000;

}else{

   count = cursor.count();//在五万条数据以内的情况下,这个速度还是挺快的

}

当然上面的语句也可以写的更优雅一些

int count = cursor2.hasNext()? 50000:cursor.count();

方法有点:

多增加了一条查询语句,进行最大条数的判断,虽然说查询语句增加了,但是结果显示查询效率确实有了很大的提高,因为这些查询通过测试都是毫秒级的.易用性得到提高

方法缺点:

  限制了分页的最大页数,使得查询结果显示的不全,一定程序上影响了用户的使用.

MongoDB 性能优化之分页查询

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

mongodb查询分页优化

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

mongodb查询分页优化(二)

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

java MongoDB分页优化

最近项目在做网站用户数据新访客统计,数据存储在MongoDB中,统计的数据其实也并不是很大,1000W上下,但是公司只配给我4G内存的电脑,让我程序跑起来气喘吁吁...很是疲惫不堪。     最常见的...
  • u013339851
  • u013339851
  • 2014年05月23日 14:17
  • 1359

java操作mongodb(分页优化)

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

Springmvc 应用Mongodb分页实现

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

MongoDB文档查询-分页查询(limit、skip)与查询结果排序(sort)

MongoDB使用find()方法查询后,可能需要对于返回结果进行排序。在有些查询中,我们并不需要返回全部结果,而是按指定的页长和页码返回指定数量的结果 limit()指定查询结果数...
  • permike
  • permike
  • 2016年08月19日 10:53
  • 5693

SpringBoot操作MongoDB实现分页查询

前几天写了一篇关于介绍SpringBoot的简单使用。以及使用SpringBoot JPA做了一次数据库的一个CURD (地址:http://blog.csdn.net/canot/article/d...
  • canot
  • canot
  • 2016年06月03日 00:34
  • 6538

MongoDB数据查询,分页,排序

MongoDB数据查询数据准备:persons.jsonvar persons = [{ name:"jim", age:25, email:"75431457@qq.com"...
  • wolf_soul
  • wolf_soul
  • 2015年11月30日 17:20
  • 1165

MongoDB多条件分页查询,新增,删除操作

MongoDB多条件分页查询,新增,删除操作
  • limenghua9112
  • limenghua9112
  • 2015年05月26日 13:53
  • 2909
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mongodb查询分页优化(二)
举报原因:
原因补充:

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