[MongoDB] aggregate 查询的优化思路

首先从业务角度出发,不必要的筛选条件和粗略的筛选条件会严重影响查询速度,比如 $or 查询和 $in 查询,视情况尽可能去掉。
程序中打印出查询条件的各部分,有 $match、$group。比如 PHP 中可以通过 var_export()。
由于 aggregate 执行主要是 pipeline 步骤,所以着重需要关注的是 $match 条件。
打印出的数组 json_encode 后可以在 Robo3T 等客户端中作为 aggregate 的条件使用。
关于 aggregate 查询条件的格式,可参考:https://studio3t.com/knowledge-base/articles/build-mongodb-aggregation-queries/
为了方便查看 json 条件格式,可以对json在线格式化,之后使用如 Example1.
aggregate() 后面直接带不了 explain() 方法,为了使用 explain() 方法查看索引使用情况等信息,复制出 $match 的 json 条件 到 find({ }) 中,然后带上 explain() 方法。
查看 explain() 显示的信息 queryPlanner 部分,里面有 winningPlan.stage 状态分析,如 Example2.
常见的 winningPlan.stage 如下:
COLLSCAN:全表扫描
IXSCAN :索引扫描
FETCH :根据索引去检索指定document
更多的可以搜索 mongodb explain 相关信息。
把 COLLSCAN 优化成 IXSCAN 使用索引,此时再看 winningPlan.inputStage.keyPattern 使用的索引字段是哪个。
如果 keyPattern 使用的是低效率的索引可以通过 hint 用法强制指定索引,支持普通查询和聚合查询。
普通查询的 hint 方法: ->find({})->hint({ diff_id: 1 })
聚合查询的 hint 参数:docs.mongodb.com,如 Example3.
Example1.
db.getCollection('diff_detail').aggregate(
[
{
"$match": {
"diff_id": ObjectId('71162dcf17a1f594edcc69bc'),
"pvalue": {
"$lt": 0.05
},
"vip": {
"$gt": 1
},
"$or": [{
"fc": {
"$gt": 1
}
}, {
"fc": {
"$lt": 1
}
}],
"diff_group": {
"$in": ["a1_vs_A1", "a2_vs_A2", "a3_vs_A3", "a4_vs_A4", "a5_vs_A5"]
}
}
},
{
"$group": {
"_id": {
"table_type": "$table_type",
"diff_group": "$diff_group"
},
"count": {
"$sum": 1
}
}
}
]
);
Example2.
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "xxxdb.diff_detail",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [
{
"$or" : [
{
"fc" : {
"$lt" : 1.0
}
},
{
"fc" : {
"$gt" : 1.0
}
}
]
},
{
"diff_id" : {
"$eq" : ObjectId("71162dcf17a1f594edcc69bc")
}
},
{
"pvalue" : {
"$lt" : 0.05
}
},
{
"vip" : {
"$gt" : 1.0
}
},
{
"diff_group" : {
"$in" : [
"a1_vs_A1",
"a2_vs_A2",
"a3_vs_A3",
"a4_vs_A4",
"a5_vs_A5"
]
}
}
]
},
"queryHash" : "22D09A47",
"planCacheKey" : "22D09A47",
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"$and" : [
{
"$or" : [
{
"fc" : {
"$lt" : 1.0
}
},
{
"fc" : {
"$gt" : 1.0
}
}
]
},
{
"diff_id" : {
"$eq" : ObjectId("71162dcf17a1f594edcc69bc")
}
},
{
"pvalue" : {
"$lt" : 0.05
}
},
{
"vip" : {
"$gt" : 1.0
}
},
{
"diff_group" : {
"$in" : [
"a1_vs_A1",
"a2_vs_A2",
"a3_vs_A3",
"a4_vs_A4",
"a5_vs_A5"
]
}
}
]
},
"direction" : "forward"
},
"rejectedPlans" : []
},
"serverInfo" : {
"host" : "mongodb446",
"port" : 27017,
"version" : "4.4.1",
"gitVersion" : "ad91a93a5a31e175f5cbf8c69561e788bbc55ce1"
},
"ok" : 1.0
}
Example3.

Refer:MongoDB适用场景
Link:https://www.cnblogs.com/farwish/p/15379066.html
[MongoDB] aggregate 查询的优化思路的更多相关文章
- MySQL 查询语句优化思路
query 语句的优化思路和原则主要提现在以下几个方面:1. 优化更需要优化的Query:2. 定位优化对象的性能瓶颈:3. 明确的优化目标:4. 从 Explain 入手:5. 多使用profile ...
- sql索引优化思路
[开发]SQL优化思路(以oracle为例) powered by wanglifeng https://www.cnblogs.com/wanglifeng717 单表查询的优化思路 单表查询是最简 ...
- neo4j - 查询效率的几种优化思路
最近在公司实习做的就是优化neo4j图形数据库查询效率的事,公司提供的是一个在Linux上搭建且拥有几亿个节点的数据库.开始一段时间主要是熟悉该数据库的一些基本操作,直到上周才正式开始步入了优化数据库 ...
- 谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现(更新优化思路)
注:本文仅用于在博客园学习分享,还在随着项目不断更新和完善中,多有不足,暂谢绝各平台或个人的转载和推广,感谢支持. 一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是 ...
- mysql优化思路
/* mysql优化思路 1.数据库设计 2.sql语句优化 3.数据库参数设置 4.恰当的硬件资源和操作系统 数据库设计 数据的3NF( ...
- JAVA MONGODB group查询的UTC时间问题
BasicDBList dateList = new BasicDBList(); dateList.add("$t"); dateList.add(28800000); DBOb ...
- Mongodb高级查询【二】
上一篇文章,写了mongodb常规操作,继续写入,本章主要讲高级查询,文本,聚集,大数据查询. Mongodb的查询语法是很多的,是NOSQL队伍中比较丰富的一个.当然有很多查询跟关系型查询无法相比. ...
- mongodb集群性能优化
mongodb集群性能优化 在前面两篇文章,我们介绍了如何去搭建mongodb集群,这篇文章我们将介绍如何去优化mongodb的各项配置,以达到最优的效果. 警告 不做任何的优化,集群搭建完成之后,使 ...
- PHP优化思路
想起来记录一下自己对PHP的优化思路 针对Nginx和 PHP-FPM进行优化 首先应该分为代码层面.配置层面.架构层面 代码层面 参见了https://segmentfault.com/a/1190 ...
- MySQL order by的一个优化思路
最近遇到一条SQL线上执行超过5s,这显然无法忍受了,必须要优化了. 首先看眼库表结构和SQL语句. CREATE TABLE `xxxxx` ( `id` ) NOT NULL AUTO_INCRE ...
随机推荐
- cmake:针对某些依赖 openssl-1.0 而机器上还有其他版本的 openssl
指定下列变量: -DOPENSSL_INCLUDE_DIR:指向 openssl-1.0 的 include 目录 -DOPENSSL_SSL_LIBRARIES:指向 openssl-1.0 的 l ...
- FFmpeg开发笔记(七)欧拉系统编译安装FFmpeg
FFmpeg支持Linux.macOS.Windows.Android等操作系统,其中Linux系列包括Ubuntu.Debian.Mint.CentOS.RHEL.Fedora等分支.FFmpeg官 ...
- 记一次 .NET某半导体CIM系统 崩溃分析
一:背景 1. 讲故事 前些天有一位朋友在公众号上找到我,说他们的WinForm程序部署在20多台机器上,只有两台机器上的程序会出现崩溃的情况,自己找了好久也没分析出来,让我帮忙看下怎么回事,就喜欢这 ...
- 【Nginx】如何使用自签CA配置HTTPS加密反向代理访问?看了这篇我会了!!
写在前面 随着互联网的发展,很多公司和个人越来越重视网络的安全性,越来越多的公司采用HTTPS协议来代替了HTTP协议.为何说HTTPS协议比HTTP协议安全呢?小伙伴们自行百度吧!我就不说了.今天, ...
- mybatis调用Oracle存储过程 带游标
存储过程 CREATE OR REPLACE PROCEDURE proc_test2(p_id IN NUMBER, v_cur OUT SYS_REFCURSOR, p_result_code O ...
- Boruvka 简介
Boruvka 是一种最小生成树算法,用于求解稠密图的 MST. [典题]CF Xor-MST: 发现边数是 $n^2$ 级别的,直接把 Kruskal 和 Prim ban 了,所以考虑使用 Bor ...
- #线段树合并#JZOJ 5365 通信
分析 取出一段区间后答案就是虚树边的个数的两倍, 考虑计算\(x\)与父亲的边对答案的贡献, 那么不能够贡献的就是\(x\)的子树下标连续的一段或者是非\(x\)的子树连续的一段, 考虑将\(x\)的 ...
- nginx集成brotli压缩算法
本文于2017年2月中旬完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. Google开源Brotli压缩算法 Brotli是一种全新的数据 ...
- OpenHarmony社区运营报告(2023年3月)
本月快讯 • <OpenHarmony 2022年度运营报告>于3月正式发布,2022年OpenAtom OpenHarmony(以下简称"OpenHarmony" ...
- 【FAQ】视频编辑服务常见问题及解答
Q1问题描述 1. 访问贴纸等素材的时候提示"网络异常,请重试"怎么办? 2. 使用AI能力时,提示"errorCode:20124 errorMsg:Method no ...