mongodb查询分页优化

 

mongodb查询分页优化 

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

1)每页显示10条

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

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

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

 

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

 

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

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

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

 

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();

方法有点:

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

方法缺点:

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

转载于:https://www.cnblogs.com/arcticBoiledWater/p/9681153.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Contest Hunter 0103最短Hamilton路径 【状压dp】 By cellur925

题目传送门 Hamilton路径的定义:从0(起点)到n-1(终点)不重不漏地经过每个点恰好一次。 由于数据范围非常小,考虑状压。如NOIP2017宝藏一题,把状态压缩设为n个点是否已到达的二进制数。1表示到达…

Failed to execute operation: No such file or directory解决办法

在给Linux服务器安装docker的时候报错解决办法:1,在/etc/systemd/system/目录下创建docker.service2,进入docker.service文件3,将下面的代码复制进去4,复制进去以后,按Esc,在输入:wq…

The goal you specified requires a project to execute but there is no POM in this directory

使用maven安装jar包到本地仓库时遇到The goal you specified requires a project to execute but there is no POM in this directory我的命令是 mvn install:install-file -DfileD:\cao\gofastdfs-2.0.jar -DgroupIdcom.aaa-DartifactIdgofastdfs -Dversion2.0 找遍了百度才…

python实现二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。输入描述: 二叉树的镜像定义:源二叉树 8/ \6 10/ \ / \5 7 9 11镜像二叉树8/ \10 6/ \ / \11 9 7 5 # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # …

java使用itext生成pdf,超简单教学,有手就行

前言&#xff1a;以前出过两期用itext填充pdf的文章&#xff0c;有人说那个会那字体加入到pdf中&#xff0c;导致pdf占用内存过大&#xff0c;那么今天就来分享一期另外的方法。 java使用itext生成pdf1、导包2、直接贴代码&#xff0c;然后大家看注释3、效果1、导包 <depen…

2018-2019-1 20165221 《信息安全系统设计基础》第一周学习总结

2018-2019-1 20165221 《信息安全系统设计基础》第一周学习总结 教材学习总结 有关vim 打开方式&#xff1a;vim [文件名]按i会进入insert模式&#xff0c;可以对代码进行编辑按Esc会进入普通模式&#xff0c;此时可以使用快捷键进行编辑&#xff0c;编辑方式为&#xff1a; 指…

itext5固定段落Paragraph,指定段落位置

前几期分析了怎么用itext生成pdf&#xff0c;有兴趣的可以去看看。 1&#xff0c;java使用itext生成pdf&#xff0c;超简单教学&#xff0c;有手就行 2&#xff0c;java使用itext填充pdf模板&#xff0c;超简单教学&#xff0c;有手就行 然后现在有了新的需求&#xff0c;需…

wordcount C

Gitee 代码链接&#xff1a;https://gitee.com/huangxue1111/codes/12rfs3ztj5ga8ymce7qi910 #include<stdio.h>#include<stdlib.h>#include<string.h>#include<windows.h>#define IN 1#define OUT 0void main() {FILE *fp;int length;fp fopen("…

PS中如何使用通道计算来进行美白

打开本机的Photoshow&#xff0c;把要美白的图片添加进来。 通过快捷键ctrlj 创建一个图层副本。 然后选择通道中的蓝色&#xff0c;复制通道&#xff0c;这里说明一下为什么要选择蓝色&#xff1a;因为蓝色和绿色是较暗的&#xff0c;把暗的选出来&#xff0c;目的是为了更…

[学习笔记]质数

&#xff08;本篇并不适合初学者看&#xff09; 质数&#xff1a;除1和本身之外&#xff0c;没有一个数能够整除它。&#xff08;否则是合数&#xff09; 1.质数判定&#xff1a; ①根号试除法。 优点&#xff1a;容易写&#xff0c;对于少量的需要判断的质数&#xff0c;比较可…

Eclipse中导入Java项目出现“No projects are found to import”

如图所示&#xff1a; &#xff0c; 这其实是你的项目中缺少了两个文件&#xff1a;.classpath文件和 .project文件 所以eclipse找不到你的项目了。 解决办法&#xff1a; 在你的Eclipse中再新建一个新的项目&#xff0c;项目的类型和项目名和你想要导入的项目名一样&am…

USB 设备驱动(写给自己看的)

集线器与控制器&#xff08;USB地址7bit&#xff09;设备&#xff0c;配置&#xff0c;端点&#xff0c;接口USB1.0&#xff08;低速1.2&#xff09;&#xff0c;1.1&#xff08;全速450m&#xff09;,2.0&#xff08;高速&#xff0c;电流传输&#xff09;区别引脚4根&#xf…

为什么tomcat在eclipse中启动了,访问不了

tomcat在eclipse中启动不了&#xff0c;有很多中情况。 我把这些可能出现的情况总结了起来&#xff1a; 原因1&#xff1a; 项目的发布目录没有在tomcat下的webapps文件下&#xff0c;导致项目启动不了。 解决&#xff1a;先把tomcat中的服务remove出来 然后双击test1服务…

数据库(表)导入导出备份

一、介绍逻辑备份是指使用工具export将数据对象的结构和数据导出到文件的过程。逻辑恢复是指当数据库对象被误操作而损坏后使用工具import利用备份的文件把数据对象导入到数据库的过程。物理备份即可在数据库open的状态下进行也可在关闭数据库后进行&#xff0c;但是逻辑备份和…

Can not find the tag library descriptor for http://java.sun.com/jsp/jstl/core

在eclipse的jsp里面出现这个错误&#xff0c;主要是缺少.jar文件或是你的.jar版本不匹配。 主要是&#xff1a;JSTL.jar 和 Standard.jar 文件。 去重新下载一下&#xff0c;然后添加到你的lib文件里面 就不会报错了。

Android TV Overscan

本文来自网易云社区 作者&#xff1a;孙有军 开发的TV应用发现在部分电视上可以显示完整&#xff0c;而其他部分电视显示不全&#xff0c;周围都会遮挡了。 原因 这是因为部分老的电视有一个overscan的概览&#xff0c;什么叫overscan呐&#xff1f;官方解释如下&#xff1a; D…

jsp页面中出现“String cannot be resolved to a type”

右键你的项目&#xff0c;Build Path–>Configure Build Path 按照步骤1–>2 –>3。 然后就大功告成了。

Druid学习之路 (四)Druid的数据采集格式

作者&#xff1a;Syn良子 出处&#xff1a;https://www.cnblogs.com/cssdongl/p/9715735.html 转载请注明出处 Druid的数据采集格式 Druid可以采集非标准化的数据诸如JSON,CSV或者以某种分隔符隔开的TSV格式,当然还支持自定义格式.虽然大部分的文档使用JSON格式,但是通过druid来…

“Found interface com.mysql.jdbc.Connection, but class was expected ”

In mysql-connecter-java-5.0 Statement is a class. in 5.1, it’s an interface. The code you write shouldn’t care too much. But if you compile against the new version, then run against the old version, you’ll have this problem. 我项目中用的是5.1的版本&am…

1. 冒泡与选择排序及其比较

冒泡排序 1. 思想 冒泡排序&#xff08;Bubble Sort&#xff09;是一种交换排序&#xff0c;基本思路是&#xff1a;两两比较相邻记录的关键字&#xff0c;如果反序则交换&#xff0c;直到没有反序的记录为止。 2. 实现 2.1 初学常用的一种 public static <T extends Compar…