[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 ...
随机推荐
- 安装centos系统必做操作
关闭SELinux sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config 在Linux系统中临时关闭SELinux(Security-E ...
- [pyplot]在同一画面上绘制不同大小的多个图像
一.背景 做计算机应用数学作业时要求使用matplotlib库在同一张图上绘制两个图像,但是这两个图像的大小不同,百度之后发现大部分只是转载的同一篇博客,而且只能实现部分子图比例排版,并不能随意设置各 ...
- opencv-python笔记(1)
openCV笔记 图像 灰度图像 0代表纯黑色,255代表白色(类似亮度) 通道拆分 通过索引拆分: import cv2 lena=cv2.imread("lenacolor.png& ...
- PyQt5报错:This application failed to start because no Qt platform plugin could be initialized
问题背景: 想使用PyQt5来创建一个可视化窗口,先在pycharm里面安装PyQt5,版本为5.14.0.之后在代码中调用此包:from PyQt5 import QtCore, QtGui, Qt ...
- 使用Go语言开发一个短链接服务:四、生成code算法
章节 使用Go语言开发一个短链接服务:一.基本原理 使用Go语言开发一个短链接服务:二.架构设计 使用Go语言开发一个短链接服务:三.项目目录结构设计 使用Go语言开发一个短链接服务:四.生成 ...
- Word文档最后一页空白页中换行符无法删除
Word文档最后一页空白页中换行符无法删除 问题如题: 尝试了delete.backspace.backspace+delete都不行. 找到了这个方法: 选中最后一页的换行符,然后段落--间距--行 ...
- swagger的使用及配置
引入坐标 <!--swagger--> <dependency> <groupId>io.springfox</groupId> <artifac ...
- ET介绍——C#更好的协程
更好的协程 上文讲了一串回调就是协程,显然这样写代码,增加逻辑,插入逻辑非常容易出错.我们需要利用异步语法把这个异步回调的形式改成同步的形式,幸好C#已经帮我们设计好了,看代码 // example2 ...
- #Splay#U137476 序列
题目 给定长度为\(n\)的序列\(Ai\) ,我们将按照如下操作给\(Ai\) 排序, 先找到编号最小的所在位置\(x1\) ,将\([1,x1]\) 翻转, 再找到编号第二小的所在位置\(x2\) ...
- Go 中的格式化字符串`fmt.Sprintf()` 和 `fmt.Printf()`
在 Go 中,可以使用 fmt.Sprintf() 和 fmt.Printf() 函数来格式化字符串,这两个函数类似于 C 语言中的 scanf 和 printf 函数. fmt.Sprintf() ...