【MongoDB】--MongoDB的Sort排序问题

目录

  • 一、问题背景描述
    • 1.1、问题背景
    • 1.2、问题分析
  • 二、建立索引支持深度翻页查询
    • 2.1、调整sort排序的内存限制【不建议】
    • 2.2、创建索引
    • 2.3、拓展--组合索引什么时候失效
  • 二、聚合查询解决深度翻页查询

一、问题背景描述

1.1、问题背景

现实系统页面翻页到20000页之后,出现异常报错。
caused by :: Sort operation used more than the maximum 67108864 bytes of RAM.
经过排查分析,Sort操作超过了MongoDB单个Session排序可使用的最大内存限制。这里针对Sort排序支持的最大内存限制是64M。

1.2、问题分析

经过排查,sort排序的字段未使用到索引,sort时触发内存限制而报错。对此,我们解决问题思路如下:
(1).调整sort排序时内存限制;
(2).给要查询的字段创建合适的索引;
(3).对于复杂多变的查询场景,无法创建所有的索引,有什么其他办法解决?

二、建立索引支持深度翻页查询

2.1、调整sort排序的内存限制【不建议】

# 比如调大到 128M
## 在线调整
> db.adminCommand({setParameter:1, internalQueryExecMaxBlockingSortBytes:134217728})## 持久到配置文件
setParameter:
internalQueryExecMaxBlockingSortBytes: 134217728

2.2、创建索引

如果查询语句的排序是单列排序,那么直接加索引即可,(升序/降序)排序规则无影响。
如果查询的排序是使用组合排序,那么需要建立合适的索引。
//-1:表示降序 1:表示升序
@CompoundIndex(name = “un_index_a_b”, def = “{a:1,b:-1}”, unique = true)
@CompoundIndex(name = “un_index_a_b”, def = “{a:1,b:1}”)
上面是我们常见创建的组合索引,设定字段升序或降序。可以使用explain()方法来判断是否使用了索引。这样针对具体问题,创建合适的索引,能够解决一些问题。
创建索引的语句如下:

db.wwy_table.dropIndex("a_1_b_-1");
db.wwy_table.createIndex({a: 1,b: -1},{name: "un_index_a_b"}
);

------经过测试,建立合适的索引并且语句执行使用了索引,查询没问题。

2.3、拓展–组合索引什么时候失效

现有wwy_table表,有索引@CompoundIndex(name = "un_index_a_b", def = "{a:1,b:-1}")。
db.wwy_table.find({delete: false}).sort({a: 1,b: 1}).explain('executionStats')

如下几种方式失效或生效
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
-----从上面可以看出,sort的升序/降序和创建的索引顺序全部相同或全部相反,才会走索引。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、聚合查询解决深度翻页查询

对于shell的find()查询方法,深度查询往往会触发sort的内存限制,对此,我们可以使用聚合查询aggregate()方法。aggregate()方法使用内存排序能用最大的内存时100M。如果在使用中,避免报错,可以需要添加?{allowDiskUse : true}?参数。

        Criteria criteria = new Criteria();criteria.and("sid").is(521131);Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria), //主mongodb自身查询条件Aggregation.sort(new Sort(Sort.Direction.DESC, "update_time")),Aggregation.skip((page-1)*size),Aggregation.limit(size)).withOptions(AggregationOptions.builder().allowDiskUse(true).build()); //解决内存不够问题

MongoDB将在聚合操作期间使用磁盘来存储数据,以便在结果集较大时能够正常完成操作。这对于处理大型数据集非常有用。

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

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

相关文章

研发管理-代码管理篇

前言: 工作了这些年,工作了三家公司,也用过主流的代码管理平台,比如SVN,git系列(gitlib,gitee),各有优点,我个人比较喜欢SVN,多人协作的代码管理难免会有代码冲突&#…

Iview Tooltip显示不换行,被遮挡

部分使用slot 方式无法解决 <Tooltip placement"top"> <Button>多行</Button> <div slot"content"> <p>显示多行信息</p> <p><i>可以自定义样式</i></p> </div> </Tooltip> 所以…

在使用mapstruct,想忽略掉List<DTO>字段里面的,`data` 字段的映射, 如何写ignore: 使用@IterableMapping

在使用mapstruct,想忽略掉List字段里面的,data 字段的映射, 如何写ignore 代码如下: public interface AssigmentFileMapper {AssigmentFileDTO assigmentFileToAssigmentFileDTO(AssigmentFile assigmentFile);AssigmentFile assigmentFileDTOToAssigmentFile(Assigment…

四川云汇优想教育咨询有限公司电商服务靠谱吗

随着抖音电商的兴起&#xff0c;越来越多的商家开始关注这一领域。四川云汇优想教育咨询有限公司作为一家专注于电商服务的企业&#xff0c;也受到了广泛的关注。那么&#xff0c;四川云汇优想教育咨询有限公司的抖音电商服务靠谱吗&#xff1f;下面我们将从多个方面进行深入剖…

python官网下载步骤图解,python官方中文文档下载

这篇文章主要介绍了python官网下载步骤图解&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 1.进入官网&#xff0c;选择自己所需要的版本 官网地址&#xff1a;Download Pytho…

【VScode和Leecode的爱恨情仇】command ‘leetcode.signin‘ not found

文章目录 一、关于command ‘leetcode.signin‘ not found的问题二、解决方案第一&#xff0c;没有下载Nodejs&#xff1b;第二&#xff0c;有没有在VScode中配置Nodejs第三&#xff0c;力扣的默认在VScode请求地址中请求头错误首先搞定配置其次搞定登入登入方法一&#xff1a;…

什么是嵌入式板卡?

嵌入式板卡是配备处理器、各种集成电路、接口和其他关键组件的电路板&#xff0c;所有这些组件都组装起来以执行特定功能。如USB、Ethernet、串口、GPIO等&#xff0c;以便连接外部设备和传感器。它们还可能包括扩展插槽&#xff0c;以便添加额外的功能或定制化的接口。总之&am…

算法学习——回溯算法

回溯算法 理论基础回溯法的效率回溯法解决的问题回溯法模板 组合思路回溯法三部曲 代码 组合&#xff08;优化&#xff09;组合总和III思路代码 电话号码的字母组合思路回溯法来解决n个for循环的问题回溯三部曲代码 组合总和思路代码 组合总和II思路代码 理论基础 什么是回溯法…

中国社科院与新加坡新跃社科联合培养工商管理博士

全球经济正在经历由科技进步与创新、政治和人口的剧烈变化所带来的巨大不确定性与挑战。企业的领导者和管理者需要发展出战略性思维和全球洞察力以便面对越来越大的经济波动。中国社科院与新加坡新跃社科联合培养工商管理博士项目的训练能够让学生在一个企业和组织的改变和发展…

R语言——文件读写(三)

目录 一、获取数据 二、读取文件 三、写入文件 四、读写Excel文件 五、读写R格式的文件 参考 一、获取数据 获取数据的三种途径&#xff1a; 1. 利用键盘来输入数据 2. 通过读取存储在外部文件上的数据 3. 通过访问数据库系统来获取数据 edit()&#xff1a;定义一个数…

SpringBoot 多环境开发配置文件

在开发过程中&#xff0c;往往开发环境和生产环境需要不同的配置。为了兼容两种运行环境&#xff0c;提高开发效率&#xff0c;可以使用多环境开发配置文件。 配置文件结构大概是这样&#xff1a; application.yml -主启动配置文件&#xff08;用于控制使用哪种环境配…

docker安装sonar后集成本地代码进行质量分析

背景 在完成代码后&#xff0c;想做一个较低层级的代码自检&#xff0c;来完善自己代码的质量 技术选型 在结合现有项目情况下&#xff0c;结合Jenkins走CI CD过程&#xff0c;选择了sonarqube 安装 下载地址:自己搜 安装教程我来出,首先sonarqube完整的过程分了两部分&…