[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 ...
随机推荐
- 三维模型3DTile格式轻量化在数据存储的重要性分析
三维模型3DTile格式轻量化在数据存储的重要性分析 三维模型3DTile格式轻量化在数据存储中占有重要地位.随着科技的不断发展,尤其是空间信息科技的进步,人们对于三维地理空间数据的需求日益增长.然而 ...
- 记录--用css画扇形菜单
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1.效果图 用手机录屏再用小程序转换的gif,可能精度上有点欠缺. 2.实现过程 1.观察及思考 开始编码前我们首先观察展开后的结构:两个 ...
- 记录--面试官:“你知道什么情况下 HTTPS 不安全么”
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 面试官:"HTTPS的加密过程你知道么?" 我:"那肯定知道啊." 面试官:"那你知道什 ...
- Spring Boot框架中针对数据文件模板的下载总结
1.前言 在我们的日常开发中,经常会碰到注入导入Excel数据到系统中的需求,而在导入Excel数据时,一般的业务系统都会提供数据的Excel模板,只有提交的Excel数据满足业务系统要求的模板时,数 ...
- abp9 .net8 升级错误记录
错误一. Cannot find compilation library location for package 'System.Security.Cryptography.Pkcs' 修复方法: ...
- Redis(5)——亿级数据过滤和布隆过滤器
一.布隆过滤器简介 上一次 我们学会了使用 HyperLogLog 来对大数据进行一个估算,它非常有价值,可以解决很多精确度不高的统计需求.但是如果我们想知道某一个值是不是已经在 HyperLogLo ...
- ContiPerf是一个轻量级的测试工具,基于JUnit 4 开发,可用于效率测试等。
1.在maven中使用ContiPerf <dependency> <groupId>junit</groupId> <artifactId>junit ...
- Oracle PL/SQL 中的 CHAR 和 VARCHAR2 比较
https://docs.oracle.com/cd/B14117_01/appdev.101/b10807/b_char.htm SQL 标准要求被比较的两个字符值具有相等的长度.如果比较中的两个值 ...
- KingbaseES V8R3 备份恢复案例 -- sys_rman物理备份异机恢复
案例说明: 在生产环境通过sys_rman执行了物理备份后,需要在异机构建测试环境,本案例描述了通过物理备份异机恢复的详细过程及操作. 适用版本: KingbaseES V8R3 节点信息: [kin ...
- Python 列表list方法clear( )和直接list [ ]的区别
x.clear()是将内存地址清空, x=[ ]会新开辟一个内存空间.