首页 > 数据库 >mongodb大数据量分页查询优化

mongodb大数据量分页查询优化

时间:2024-02-06 17:04:59浏览次数:30  
标签:count pageNum 分页 mongodb 查询 条数 数据量 query page

业务背景

mongodb大数据量分页查询主要耗时是查询总条数,所以有两种优化方式

1.不查询总条数,查询最近N页数据[改动略多,执行耗时很短]

2.增加页面时间范围必填条件[改动很小,执行耗时略长,与数据量有关]

[比如默认查询创建时间最近一个月的数据 根据数据量做调整,创建时间有组合索引]

这两种优化方式,都需要与产品沟通

下面着重介绍一下第一种优化方式

不查询总条数,查询最近N页数据。

类似百度,第1-6页查询10页数据,第7页开始查询查询(pageNum+4)页数据,类似懒加载

mongodb大数据量分页查询优化_大数据量优化查询

mongodb大数据量分页查询优化_大数据量优化查询_02

需要展示总条数,使用定时任务每天/每小时单独查询总条数放入更新到缓存中。

直接上代码

使用mongodb依赖

        <!-- mongo -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
            <version>2.2.7.RELEASE</version>
        </dependency>

yml文件配置

spring:
  data:
    mongodb:
      uri: mongodb://账号:密码@ip地址:端口/数据库名称?authSource=admin

业务伪代码

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public Page<Entity> queryPage(queryVO vo) {
        Integer pageNum = vo.getPageNum();
        Integer pageSize = vo.getPageSize();
        Query query = new Query();
        //条件拼接
        query.addCriteria(Criteria.where("companyId").is(vo.getCompanyId()));
        // 分页查询 查询 pageNum-1 页的数据
        Pageable pageable = PageRequest.of(pageNum - 1, pageSize);
        // 排序字段
        Sort sort = Sort.by(Sort.Direction.DESC, "updateTime");
        query.with(sort).with(pageable);
        List<Entity> list = this.mongoTemplate.find(query, Entity.class);

        // 不查询总条数
        // long count = mongoTemplate.count(query, Entity.class);
        // 分页查询  不查询总条数  需要单独查询  是否有数据
        // 第1-6页  总页数=10  从第7页开始 需要往后 + 4 页
        int limitParam = (pageNum < 7 ? 10 : (pageNum + 4)  ) * pageSize;
        query.skip(limitParam).limit(1);
        Long count = null;
        long isExists = this.mongoTemplate.count(query, Entity.class);
        // 如果查询结果为空 则查询总条数,如果不为空则 limitParam为总条数
        if (isExists == 0) {
            // 查询总条数方法 修改
            query.skip(0).limit(limitParam);
            count = mongoTemplate.count(query, Entity.class);
        }else {
            count = (long) limitParam;
        }
        Page<Entity> page = new Page<>();
        page.setCurrent(pageNum);
        page.setSize(pageSize);
        page.setTotal(count);
        page.setRecords(list);
        return page;
    }

查询效果展示

mongodb大数据量分页查询优化_mongodb_03


最后

elasticsearch查询速度很快,如果数据量很大比如上亿,为了加快查询速度,可以采用查询符合条件的前1万条用作总条数,用来分页

关系型数据库(mysql,PostgreSql等)都可以使用上面的两种方式优化大数量分页查询

欢迎大家评论,相互沟通学习

标签:count,pageNum,分页,mongodb,查询,条数,数据量,query,page
From: https://blog.51cto.com/u_12383390/9629089

相关文章

  • MyBatis使用分页插件
    MyBatis使用分页插件PageHelper是国内非常优秀的开源mybatis分页插件,它支持基本主流与常用的数据库,例如:mysql、Oracle、DB2等。PageHelper在GitHub的项目地址:https://github.com/pagehelper/Mybatis-PageHelper分页插件的原理(1)在MyBatis执行SQL语句之前,拦截器可以获取SQL......
  • MongoDB配置用户账号与访问控制
    1.admin库创建root角色权限的用户db.createUser({user:"root",pwd:"123qwe",roles:["root"]})2.修改mongo配置文件,开启用户名密码连接验证security:authorization:enabled3.cmd关闭mongo服务netstopMongoDB4.cmd启动mongo服务netstartMongoDB直接localhost连接......
  • 数据量大导致接口请求超时
    问题场景某个接口因数据量过大导致请求超时,报错NetworkError。解决办法webpack默认2分钟后请求超时,更改vue.config.js配置如下://修改webpack默认2分钟的超时proxyTimeout:10*60*1000,onProxyReq:(proxyReq,req,res)=>req.setTime......
  • MongoDB - 理解业务场景、简介、特点和体系结构、数据类型等,部署Linux系统
    MongoDBNotesMongoDB用起来-快速上手理解MongoDB的业务场景、熟悉MongoDB的简介、特点和体系结构、数据类型等。能够在Windows和Linux下安装和启动MongoDB、图形化管理界面Compass的安装使用掌握MongoDB基本常用命令实现数据的CRUD掌握MongoDB的索引类型、索引管理、执行计......
  • Python 基于pymongo操作Mongodb学习总结
    实践环境Python3.6.4pymongo4.1.1pymongo-3.12.3-cp36-cp36m-win_amd64.whl下载地址:https://pypi.org/simple/pymongo/代码实践#!/usr/bin/envpython#-*-coding:utf-8-*-importdatetimeimportrandomimportpymongofrompymongoimportMongoClientfrombson.objecti......
  • 在ubuntu16.04下,源码编译安装特定版本的MongoDB PHP扩展
    背景:我的php项目在连接其他mongo库时报:Serveratxxx:27017reportswireversion5,butthisversionoflibmongocrequiresatleast6(MongoDB3.6)原因:本地MongoDBPHP扩展的版本过高解决方法:降低本地PHP扩展MongoDB版本,现在要降到mongodb-1.12.0版本步骤:1:下载......
  • kettle从入门到精通 第三十八课 kettle 分页全量同步(数据量大)
    1、上一课我们学习了在数据量小的情况下的全量同步示例,本次我们一起学习下kettle分页全量同步。2、kettle分页全量同步示例依然基于test数据库,从t1表全量同步数据到t2表,由于t1表的数据比较大,所以选择分页全量同步策略,如下图所示。前提:a、基于mysql数据库b、分页查询数据基......
  • MongoDB由浅入深(查询)
    //基础查询db.orderSlic.find();//根据ID查询db.orderSlic.find({_id:54708407});//范围查询db.orderSlic.find({"_id":{"$gte":54708407,"$lte":54708409}});//多字段分组统计db.orderSlic.aggregate([{$group:{_id:{shopId:"$......
  • sprinboot实现分页查询
    1.环境介绍:springboot2.7.4pagehelper1.4.6mybatis-plus3.5.12.需求分析通过前端传回的分页要求的参数<页码,页数据量>,返回结果实现{"code":0,"message":"操作成功","data":{"total":5,"items&quo......
  • spring boot分页
    0verridepublicPair<List<ApplyDto>,Long>selectDbApplyList(ApplyDtoapplyDto){Longid=applyDto.getId();//办事顺信DbSupervisiondbSupervision=abSupervisionMapper.selectDbSupervisionByDbId(id);if(dbSupervision==null){thrownewRuntimeExcep......