当前位置: 首页 > news >正文

mongodb聚合排序的一个巨坑

现象:

mongodb cpu动不动要100%,如下图

b33bd5ddcbe55a25de93863f6f415f1d.png               

分析原因:

查看慢日志发现,很多条这样的查询,一直未执行行完成,占用大量的CPU

[{$match: {"tags.taskId": "64dae0a9deb52d2f9a1bd71e",grnty: "minute","tags.type": "task","tags.taskRecordId":"64e5c004133738231bc36906",},},{$sort: {_id: -1,},},{$limit: 5,},{$unwind: "$ss",},{$group: {_id: "$ss.vs.inputQps",qps: {$avg: "$ss.vs.inputQps",},},},
]

查看程序里面有一段聚合的代码

Criteria criteria = new Criteria();
tags.forEach((k,v)->{String format = String.format(TAG_FORMAT, k);criteria.and(format).is(v);
});
criteria.and(MeasurementEntity.FIELD_GRANULARITY).is(Granularity.GRANULARITY_MINUTE);
MatchOperation match = Aggregation.match(criteria);
SortOperation sort = Aggregation.sort(Sort.by(Sort.Direction.DESC, "_id"));
LimitOperation limit = Aggregation.limit(5);
UnwindOperation unwind = Aggregation.unwind("ss", false);
GroupOperation group = Aggregation.group().avg("ss.vs.inputQps").as("qps");
Aggregation aggregation = Aggregation.newAggregation(match, sort, limit, unwind, group);

看一下这个代码也没有多大问题,但是就是执行很慢很慢,于是我explain这条语句,发现是先执行全集合sort 然后再match的,理论上应该是先match,然后再执行针对查询的结果做sort的

afc8284f9012b97ba7173a34d6b04b0b.png

已经使用了 $match 和 $sort 操作来筛选和排序文档。仍然对整个集合进行了排序?

这可能是由于 MongoDB 的查询优化器在执行查询时做出的决策。在 MongoDB 中,查询优化器会尝试根据查询计划和索引来优化查询性能。在某些情况下,优化器可能会选择在 $match 操作之后对整个集合进行排序,而不仅仅是对 $match 操作筛选出的文档进行排序。这可能是因为优化器认为在整个集合上进行排序的成本更低,或者由于其他优化策略。如果你希望只对 $match 操作筛选出的文档进行排序,可以尝试使用索引来优化查询。确保你的查询条件和排序字段都有适当的索引,这样可以帮助优化器做出更好的决策,以便只对筛选结果进行排序。

解决方案

在这种情况下,你可以尝试创建一个复合索引,包含筛选条件和排序字段。例如,你可以创建一个包含 "tags.taskId","grnty","tags.typ","tags.taskRecordId","_id" 字段的复合索引。这样,MongoDB 在执行查询时可以使用该索引来加速筛选和排序操作。

 总结

为了只对筛选结果进行排序,你可以尝试以下步骤:

  1. 创建一个复合索引,包含筛选条件和排序字段。

  2. 确保查询条件和排序字段在索引中的顺序与聚合管道中的顺序一致。

  3. 使用 explain() 方法来查看查询的执行计划和索引使用情况,以便进行优化。

相关文章:

mongodb聚合排序的一个巨坑

现象: mongodb cpu动不动要100%,如下图 分析原因: 查看慢日志发现,很多条这样的查询,一直未执行行完成,占用大量的CPU [{$match: {"tags.taskId": "64dae0a9deb52d2f9a1bd71e",grnty: …...

无涯教程-分类算法 - 随机森林

随机森林是一种监督学习算法,可用于分类和回归,但是,它主要用于分类问题,众所周知,森林由树木组成,更多树木意味着更坚固的森林。同样,随机森林算法在数据样本上创建决策树,然后从每…...

c#常见的排序算法

在C#中,常见的排序算法包括以下几种: 1. 冒泡排序(Bubble Sort):比较相邻的元素,如果顺序不对就交换它们,重复多次直到排序完成。 2. 插入排序(Insertion Sort)&#xf…...

Redis 持久化和发布订阅

一、持久化 Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以 Redis 提供了持久化功能! 1.1、RDB(Redis DataBase) 1.1.1 …...

k8s使用ECK(2.4)形式部署elasticsearch+kibana-http协议

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、准备elasticsearch-cluster.yaml二、部署并测试总结 前言 之前写了eck2.4部署eskibana,默认的话是https协议的,这里写一个使用http…...

[maven]关于pom文件中的<relativePath>标签

关于pom文件中的<relativePath>标签 为什么子工程要使用relativePath准确的找到父工程pom.xml.因为本质继承就是pom的继承。父工程pom文件被子工程复用了标签。&#xff08;可以说只要我在父工程定义了标签&#xff0c;子工程就可以没有&#xff0c;因为他继承过来了&…...

11. 网络模型保存与读取

11.1 网络模型保存(方式一) import torchvision import torch vgg16 torchvision.models.vgg16(pretrainedFalse) torch.save(vgg16,"./model/vgg16_method1.pth") # 保存方式一&#xff1a;模型结构 模型参数 print(vgg16) 结果&#xff1a; VGG((feature…...

新SDK平台下载开源全志V853的SDK

获取SDK SDK 使用 Repo 工具管理&#xff0c;拉取 SDK 需要配置安装 Repo 工具。 Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workflow. Repo is…...

多图详解VSCode搭建Java开发环境

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

基于JavaWeb和mysql实现网上书城前后端管理系统(源码+数据库+开题报告+论文+答辩技巧+项目功能文档说明+项目运行指导)

一、项目简介 本项目是一套基于JavaWeb和mysql实现网上书城前后端管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都…...

Swift创建单例

Objective-C使用GCD 中的dispatch_once_t 可以保证里面的代码只被调用一次&#xff0c;以此保证单例在线程上的安全。 但是在Swift 中由于废弃了原有的Dispatch once方法&#xff0c;因此无法使用once 进行单例的创建。 我们可以使用struct 存储类型变量&#xff0c;并且使用…...

问道管理:市盈率怎么计算?

市盈率是衡量一家公司股票价格是否合理的重要目标之一&#xff0c;核算市盈率的公式是将一家公司的股票价格除以每股收益&#xff0c;也便是市盈率 股票价格 每股收益。市盈率能够告诉你一个公司的股票价格是否高估或轻视&#xff0c;是投资者在买入或卖出一家公司股票时需求…...

Ansible File模块,Ansible File模块详解,文件管理的自动化利器

Ansible是一款强大的自动化工具&#xff0c;用于管理和配置IT基础设施。在Ansible中&#xff0c;File模块&#xff08;File Module&#xff09;是一个重要的组件&#xff0c;用于文件管理和操作。本文将深入探讨Ansible File模块&#xff0c;了解它如何成为文件管理的自动化利器…...

记录http与mqtt的区别

HTTP是最流行和最广泛使用的协议。但在过去几年中&#xff0c;MQTT迅速获得了牵引力。当我们谈论物联网开发时&#xff0c;开发人员必须在它们之间做出选择。 设计和消息传递 MQTT以数据为中心&#xff0c;而HTTP是以文档为中心的。HTTP是用于客户端 – 服务器计算的请求 – …...

导入excel数据给前端Echarts实现中国地图-类似热力图可视化

导入excel数据给前端Echarts实现中国地图-类似热力图可视化 程序文件&#xff1a; XinqiDaily/frontUtils-showSomeDatabaseonMapAboutChina/finalproject xin麒/XinQiUtilsOrDemo - 码云 - 开源中国 (gitee.com) https://gitee.com/flowers-bloom-is-the-sea/XinQiUtilsOr…...

【MySQL系列】MySQL复合查询的学习 _ 多表查询 | 自连接 | 子查询 | 合并查询

「前言」文章内容大致是对MySQL复合查询的学习。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、基本查询回顾二、多表查询三、自连接四、子查询4.1 单行子查询4.2 多行子查询4.3 多列子查询4.4 在from子句中使用子查询 五、合并查询 一、基本查询回顾…...

微信小程序使用本地图片在真机预览不显示的问题解决

开发工具上本地图片可以显示&#xff0c;但是在真机上预览的时候不能显示 通常我们代码路径是代码是这样写的&#xff1a; <view class"logo"><image src"../../img/e8591fd7b1043bd3b4eb07d86243b5b.png"></image> </view> 最…...

Texlive2023与Texstudio2023卸载与安装(详细全程)

早在两年前安装了texlive2020&#xff0c;最近重新使用总是报错&#xff0c;好像是因为版本过低。我就找了个时间更新一下texlive版本&#xff0c;全程如下。 1、卸载texlive老版本 1&#xff09;找到texlive目录&#xff0c;比如我的是D:\texlive\2022\tlpkg\installer&…...

塞浦路斯公司注册 塞浦路斯公司开户 塞浦路斯公司年审

一、为什么选择塞浦路斯 1、没有外汇管制&#xff1b; 2、注册公司无需验资实缴&#xff1b; 3、塞浦路斯公司分红没有税收&#xff1b; 4、塞浦路斯拥有欧洲蕞低的企业所得税&#xff0c;为净利润的 12.5%&#xff1b; 5、除某些特定业务要在经营前获得许可&#xff0c;基…...

XSS盲打练习(简单认识反射型、存储型XSS和cookie欺骗)

文章目录 挖掘cms网站XSS漏洞利用XSS平台盲打CMS&#xff0c;获取后台管理cookiecookie欺骗登录管理员账户 挖掘cms网站XSS漏洞 来到cms网站主页&#xff0c;发现有一个搜索框&#xff0c;输入任意内容后搜索&#xff0c;发现内容会回显&#xff0c;这里可能存在反射型XSS漏洞…...

Shell脚本:基础知识和使用指南

Shell脚本是一种用于自动化任务和进程的强大工具。它们允许你编写一系列的命令&#xff0c;这些命令可以在shell环境中执行&#xff0c;从而避免了手动输入每个命令的需要。Shell脚本对于减少重复的工作、提高效率以及构建复杂的自动化过程非常有用。 什么是Shell&#xff1f;…...

Resource Hacker下载

下载路径 Resource Hacker (angusj.com)http://www.angusj.com/resourcehacker/#download 应用方法示例 【2023年更新】手把手教你去除 WinRAR 的弹窗广告_winrar广告怎么去除_areosun的博客-CSDN博客https://blog.csdn.net/haiyunzhiqiu/article/details/119176038#comment…...

Kubernetes入门 十、HPA 自动扩/缩容

目录 概述安装metrics-server使用HPA 概述 我们已经可以通过手动执行 kubectl scale 命令实现Pod的扩缩容&#xff0c;但是这显然不符合 Kubernetes 的定位目标–自动化和智能化。Kubernetes 期望可以通过监测Pod的使用情况&#xff0c;实现 Pod 数量的自动调整&#xff0c;于…...

Django报错:SystemCheckError: System check identified some issues解决办法

今天练习django自定义标签时&#xff0c;一开始在APPbook中写了自定义标签book_tags.py 测试成功&#xff0c;之后新建了一个APPblogs&#xff0c;测试在blogs中创建模板使用自定义标签&#xff0c;于是直接把book/templatetags包直接赋值到blogs目录里。在页面里加载自定义标…...

JavaScript设计模式(一)——构造器模式、原型模式、类模式

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…...

python 读文件,跳过有问题的那行

报错&#xff1a; UnicodeDecodeError: gbk codec cant decode byte 0xfa in position 4781: illegal multibyte sequence 解决方案&#xff1a; f open("20091012134152.txt", encoding"gbk", mode"r") 改成 f open("20091012134152.tx…...

Spring Boot Actuator的Env端点存在本地文件包含(LFI)漏洞CVE-2020-5421

文章目录 0.前言1.参考文档2.基础介绍3.漏洞利用原理3.解决方案1. 升级Spring Boot版本2. 限制端点的访问3. 禁用环境端点4. 不公开敏感的Actuator端点5. 开启安全审计 0.前言 背景&#xff1a; Spring Boot Actuator的Env端点存在本地文件包含(LFI)漏洞CVE-2020-5421。被扫描到…...

Leetcode 最后一个单词的长度

给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#xff1a; 输入&#xff1a;s “Hello World” 输出&#xff1a;5 解释&a…...

css ,less和sass的区别[简洁易懂

CSS、Less和Sass都是用于样式表编写和管理的技术&#xff0c;它们之间有以下区别&#xff1a; CSS&#xff08;层叠样式表&#xff09;是一种标准的样式表语言&#xff0c;用于描述网页的外观和样式。它是前端开发中最基础和常用的技术&#xff0c;所有网页都需要使用CSS来定义…...

有了ChatGPT的帮助,开发者的生产力会提高10-100倍

在过去的几十年里&#xff0c;可以说没有哪个领域像软件开发那样&#xff0c;以如此激进的方式发展。相关的技术层出不穷&#xff0c;速度惊人&#xff0c;生成式人工智能的出现更是将让这些发展继续加速。 尽管有些人猜测生成式人工智能产品将会终结软件开发这个人类职业&am…...