【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.mzph.cn/news/230492.shtml

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

相关文章

Improving IP Geolocation with Target-Centric IP Graph (Student Abstract)

ABSTRACT 准确的IP地理定位对于位置感知的应用程序是必不可少的。虽然基于以路由器为中心(router-centric )的IP图的最新进展被认为是前沿的,但一个挑战仍然存在:稀疏IP图的流行(14.24%,少于10个节点,9.73%孤立)限制了图的学习。为了缓解这个问题,我们将目标主机(ta…

【LeetCode刷题笔记(8-2)】【Python】【接雨水】【单调栈】【困难】

文章目录 引言接雨水题目描述提示 解决方案2:【单调栈】结束语 【接雨水】 【LeetCode刷题笔记(8-1)】【Python】【接雨水】【动态规划】【困难】 引言 编写通过所有测试案例的代码并不简单,通常需要深思熟虑和理性分析。虽然这…

200kw直流电子负载测试

在进行200kw直流电子负载测试时,需要设置合适的负载参数,如电流、电压和功率等,并记录测试结果。在测试过程中,可以通过改变负载参数来模拟不同工作条件下的电子设备的性能。通过对电子设备在不同负载条件下的响应进行测试和分析&…

JupyterHub 如何切换 conda 小环境

JupyterHub 如何切换 conda 小环境 服务器已经部署好 JupyterHub ,相关端口请看对应答疑群群公告。在Jupyterhub 中使用 conda 创建的小环境,首先 ssh 登录上服务器或者在 JupyterHub 网页端打开终端 terminal。然后安装 conda ,方法请见 Q4&…

【MyBatis Plus】逻辑删除、分页、乐观锁的应用及讲解

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《MyBatis-Plus》。🎯🎯 &am…

改进灰狼算法求解:考虑需求响应的风-光柴-储容量优化配置

目录 文章摘要: 亮点: 研究背景: 考虑需求相应的容量配置: 风、光、柴、储微电网模型: 储能配置模型: 改进的灰狼算法: 基于余弦规律变化的收敛因子 引入动态权重策略 运行效果&#…

数据结构:图文详解 队列 | 循环队列 的各种操作(出队,入队,获取队列元素,判断队列状态)

目录 队列的概念 队列的数据结构 队列的实现 入队 出队 获取队头元素 获取队列长度 循环队列的概念 循环队列的数据结构 循环队列的实现 判断队列是否为空 判断队列是否已满 入队 出队 得到队头元素 得到队尾元素 队列的概念 队列(Queue&#xff0…

基于单片机的视力保护及身姿矫正器设计(论文+源码)

1. 系统设计 在本次设计中,其系统整个框图如图2-1所示。其主要的核心控制模块由超声波模块,光敏电阻,按键模块,复位电路,红外模块,LCD显示等组成。其包括自动模式,手动模式。自动模式&#xff…

upload-labs笔记

简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共21关,每一关都包含着不同上传方式。 文件上传漏洞是指: Web 服务器允许用户将文件上传至其…

Linux部署Nacos注册中心结合内网穿透实现远程访问UI管理界面

文章目录 1. Docker 运行Nacos2. 本地访问Nacos3. Linux安装Cpolar4. 配置Nacos UI界面公网地址5. 远程访问 Nacos UI界面6. 固定Nacos UI界面公网地址7. 固定地址访问Plik8. 结语 Nacos是阿里开放的一款中间件,也是一款服务注册中心,它主要提供三种功能&#xff1a…

多序列图像拼接

这里写自定义目录标题 图像匹配图像匹配代码 图像融合main.py运行代码 总的来说,步骤如下: 效果如下: 拼接好的图如下: 图像匹配 依次为 特征点提取,特征点筛选,图像变换。 常见的图像匹配算法有&…

2024上半年软考别轻易尝试!先了未发布

最近几年,软件考试变得非常受欢迎!不论你的专业、学历或工作时间如何,你都可以报名参加,而且通过考试取得证书还能用来抵扣个人所得税、评职称、帮助落户和参与招投标等等。 身边的朋友们纷纷参加软考,这让我也产生了…

下一代实时数据库:Apache Doris 【六】数据划分

3.4 数据划分 3.4.1 列定义3.4.2 分区与分桶3.4.3 PROPERTIES3.4.4 ENGINE3.4.5 其他后记 3.4 数据划分 以 3.3.2 的建表示例来理解。 3.4.1 列定义 以 AGGREGATE KEY 数据模型为例进行说明。更多数据模型参阅 Doris 数据模型。 列的基本类型, 可以通过在 mysql-cli…

山区老人爱的礼物丨走进武隆区土地乡为山区老人送温暖

从车水马龙的城市到人烟稀少的乡村,穿越重峦叠嶂的高山,见到的是独属于大山的辽阔和山区老人眼中的星河。近日,传益千里为爱出发,在三棵柚公益基金会的支持下开展“山区老人爱的礼物”公益计划,走进武隆区土地乡&#…

Unity Meta Quest 一体机开发(十一):【手势追踪】远距离抓取

文章目录 📕教程说明📕玩家配置 DistanceHandGrabInteractor📕物体配置 DistanceHandGrabInteractable📕调整物体飞向手部的速度📕调整探测物体的范围⭐HandFrustumNarraw⭐HandFrustumWide⭐HeadFrustum 此教程相关的…

探讨前端技术的未来:创新与适应的必要性

一、引言 2023年,IT圈似乎被一种悲观的论调所笼罩,那就是“Java 已死、前端已凉”。然而,真相是否如此呢?本文将围绕这一主题,探讨前端的现状和未来发展趋势。 二、为什么会出现“前端已死”的言论 这一言论的出现并…

盛元广通农产品质量检测实验室管理系统

盛元广通农产品质量检测实验室管理系统旨在打造智慧化市、区/镇、企业三位一体的区域安全监管体系,系统可以记录和追踪样品的来源、处理过程和结果,确保样品的安全性和可追溯性自动化检测流程,包括检测方法的设定、数据的记录和分析等&#x…

健康卤味思想引领市场新潮流,卤味市场迎来健康变革

健康卤味思想正在逐渐渗透到卤味市场中,引领着消费者对于卤味产品的选择和需求。这一变革不仅为消费者带来了更加健康、美味的卤味产品,也为卤味市场注入了新的活力。 一、健康卤味思想的兴起 随着消费者对于健康饮食的关注度不断提高,健康卤…

【node】 地址标准化 解析手机号、姓名、行政区

地址标准化 解析手机号、姓名、行政区 实现效果链接源码 实现效果 将东光县科技园南路444号马晓姐13243214321 解析为 东光县科技园南路444号 13243214321 河北省;沧州市;东光县;东光镇 马晓姐 console.log(address, phone, divisions,name);链接 API概览 源码 https://gi…

Java 基础学习(九)API概述、Object、String、正则表达式

1 API概述 1.1 API概述 1.1.1 什么是API API(Application Programming Interface),意为:应用程序接口。API就是已经写好的的程序或功能,程序要需要时可以直接调用,无需再次编写。 API可以大致分为如下几类: 编程语…