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

Mongodb聚合:$planCacheStats

执行查询时,MongoDB 查询规划器会根据可用索引选择并缓存效率最高的查询计划。$planCache可以返回所有集合的查询计划缓存信息。要使用$planCache,必须把$planCacheStats阶段放在管道最前面。

语法

{ $planCacheStats: { } }

使用

  • $planCacheStats必须是管道的第一个阶段
  • $planCacheStats不能应用于事务和$facet阶段
  • $planCacheStats需要的读关注级别为"local"
  • 如果系统启用了权限控制,用户必须要有对集合的planCacheRead授权
  • 当使用查询加密,$planCacheStats阶段会忽略对加密集合的操作,即便是操作被正常缓存。

读取偏好

$planCacheStats在选择返回计划缓存信息的主机时,会遵守读取偏好。

应用程序可能以副本集的不同成员为目标。因此,每个副本集成员可能会收到不同的读取命令,并拥有与其他成员不同的计划缓存信息。尽管如此,在副本集或分片集群上运行$planCacheStats仍会遵守正常的读取优先规则。也就是说,在副本集上,该操作只从副本集的一个成员处收集计划缓存信息;在分片集群上,该操作只从每个分片副本集的一个成员处收集计划缓存信息。

输出

$planCacheStats的输出取决于完成查询所使用的查询引擎,version字段的值表明使用了哪个查询引擎:

  • 1表示使用了经典引擎。
  • 2表示使用了基于时隙的查询执行引擎。
经典执行引擎

对于使用经典执行引擎的查询,$planCacheStats会返回与下面类似的文档:

{"version" : 1,"createdFromQuery" : <document>,"queryHash" : <hexadecimal string>,"planCacheKey" : <hexadecimal string>,"isActive" :  <boolean>,"works" : <NumberLong>,"cachedPlan" : {"stage" : <STAGE1>,"filter" : <document>,"inputStage" : {"stage" : <STAGE2>,...}},"timeOfCreation" : <date>,"creationExecStats" : [   //每个候选计划的执行统计文档{"nReturned" : <num>,"executionTimeMillisEstimate" : <num>,"totalKeysExamined" : <num>,"totalDocsExamined" :<num>,"executionStages" : {"stage" : <STAGE A>,..."inputStage" : {"stage" : <STAGE B>,...}}},...],"candidatePlanScores" : [<number>,...],"indexFilterSet" : <boolean>,"estimatedSizeBytes" : <num>,"host" : <string>,"shard" : <string>
}

对于使用基于slot的查询执行引擎的查询,$planCacheStats会返回与下面类似的文档:

{"version" : 2,"queryHash" : <hexadecimal string>,"planCacheKey" : <hexadecimal string>,"isActive" :  <boolean>,"works" : <NumberLong>,"cachedPlan" : {"slots" : <string>,"stages": <string>},"indexFilterSet" : <boolean>,"estimatedSizeBytes" : <num>,"host" : <string>
}

每份文档都包含各种查询计划和执行统计信息,包括:

字段说明
version查询引擎的版本号,1为经典引擎,2为基于slot的执行引擎
createdFromQuery一个包含了产生该缓存条目的特定查询的文档
isActive布尔值,表示是否处于活动状态,如果为true,表示查询规划器当前正在使用它产生查询计划;如果为false,则表示查询规划期当前没有使用它
queryHash一个16进制格式的字符串,就是查询模型的哈希值
works查询规划器评估候选计划的试运行期间查询执行计划执行的 "工作单元 "数量
timeOfCreation创建条目的时间
creationExecStats执行统计文档数组。该数组包含每个候选计划的文档
candidatePlanScorescreationExecStats数组中列出的候选计划的得分数组
indexFilterSet布尔值,表示查询形状是否存在索引过滤器
estimatedSizeBytes计划缓存条目的估计大小(字节)
hostmongod实例的主机名和端口号。当运行于分片集群时,操作返回每个分片副本集的信息,并使用分片和主机字段进行区分
shard分片名称,仅在分片集群上运行时可用

举例

下面的例子使用orders集合:

db.orders.insertMany( [{ "_id" : 1, "item" : "abc", "price" : NumberDecimal("12"), "quantity" : 2, "type": "apparel" },{ "_id" : 2, "item" : "jkl", "price" : NumberDecimal("20"), "quantity" : 1, "type": "electronics" },{ "_id" : 3, "item" : "abc", "price" : NumberDecimal("10"), "quantity" : 5, "type": "apparel" },{ "_id" : 4, "item" : "abc", "price" : NumberDecimal("8"), "quantity" : 10, "type": "apparel" },{ "_id" : 5, "item" : "jkl", "price" : NumberDecimal("15"), "quantity" : 15, "type": "electronics" }
] )

在集合上创建以下索引:

db.orders.createIndex( { item: 1 } );
db.orders.createIndex( { item: 1, quantity: 1 } );
db.orders.createIndex( { quantity: 1 } );
db.orders.createIndex( { quantity: 1, type: 1 } );
db.orders.createIndex({ item: 1, price: 1 },{ partialFilterExpression: { price: { $gte: NumberDecimal("10")} } }
);

其中,索引{ item:1, price: 1 }是部分索引,仅索引价格字段大于或等于NumberDecimal("10")的文档。

运行下面的查询:

db.orders.find( { item: "abc", price: { $gte: NumberDecimal("10") } } )
db.orders.find( { item: "abc", price: { $gte: NumberDecimal("5") } } )
db.orders.find( { quantity: { $gte: 20 } } )
db.orders.find( { quantity: { $gte: 5 }, type: "apparel" } )

上面的查询是通过基于slot的查询执行引擎完成的。

返回查询缓存中所有条目的信息

下面的聚合管道使用$planCacheStats返回集合的计划缓存条目信息:

db.orders.aggregate( [{ $planCacheStats: { } }
] )

输出:

[{                                             version: '2',queryHash: '478AD696',planCacheKey: '21AE23AD',isActive: true,works: Long("7"),timeOfCreation: ISODate("2023-05-22T20:33:49.031Z"),cachedPlan: {...},indexFilterSet: false,isPinned: false,estimatedSizeBytes: Long("8194"),host: 'mongodb1.example.net:27018'},{                                            version: '2',queryHash: '3D8AFDC6',planCacheKey: '1C2C4360',isActive: true,works: Long("6"),timeOfCreation: ISODate("2023-05-22T20:33:50.584Z"),cachedPlan: {...},indexFilterSet: false,isPinned: false,estimatedSizeBytes: Long("11547"),host: 'mongodb1.example.net:27018'},{                                          version: '2',queryHash: '27285F9B',planCacheKey: '20BB9404',isActive: true,works: Long("1"),timeOfCreation: ISODate("2023-05-22T20:33:49.051Z"),cachedPlan: {...},indexFilterSet: false,isPinned: false,estimatedSizeBytes: Long("7406"),host: 'mongodb1.example.net:27018'},{                                          version: '2',queryHash: '478AD696',planCacheKey: 'B1435201',isActive: true,works: Long("5"),timeOfCreation: ISODate("2023-05-22T20:33:49.009Z"),cachedPlan: {...},indexFilterSet: false,isPinned: false,estimatedSizeBytes: Long("7415"),host: 'mongodb1.example.net:27018'}],

查找查询哈希缓存详情

要返回特定查询散列的计划缓存信息,可使用$planCacheStats阶段后,可以在planCacheKey字段上添加$match

以下聚合管道使用$planCacheStats之后的$match阶段来返回特定查询散列的特定信息:

db.orders.aggregate( [{ $planCacheStats: { } },{ $match: { planCacheKey: "B1435201"} }
] )

输出:

[{version: '2',queryHash: '478AD696',planCacheKey: 'B1435201',isActive: true,works: Long("5"),timeOfCreation: ISODate("2023-05-22T20:33:49.009Z"),cachedPlan: {slots: '$$RESULT=s11 env: { s3 = 1684787629009 (NOW), s6 = Nothing, s5 = Nothing, s1 = TimeZoneDatabase(Asia/Kuwait...Etc/UCT) (timeZoneDB), s10 = {"item" : 1, "price" : 1}, s2 = Nothing (SEARCH_META) }',stages: '[2] nlj inner [] [s4, s7, s8, s9, s10] \n' +'    left \n' +'        [1] cfilter {(exists(s5) && exists(s6))} \n' +'        [1] ixseek s5 s6 s9 s4 s7 s8 [] @"358822b7-c129-47b7-ad7f-40017a51b03c" @"item_1_price_1" true \n' +'    right \n' +'        [2] limit 1 \n' +'        [2] seek s4 s11 s12 s7 s8 s9 s10 none none [] @"358822b7-c129-47b7-ad7f-40017a51b03c" true false \n'},indexFilterSet: false,isPinned: false,estimatedSizeBytes: Long("7415"),host: 'mongodb1.example.net:27018'}
]

相关文章:

Mongodb聚合:$planCacheStats

执行查询时&#xff0c;MongoDB 查询规划器会根据可用索引选择并缓存效率最高的查询计划。$planCache可以返回所有集合的查询计划缓存信息。要使用$planCache&#xff0c;必须把$planCacheStats阶段放在管道最前面。 语法 { $planCacheStats: { } }使用 $planCacheStats必须…...

8个简约精美的WordPress外贸网站主题模板

Simplify WordPress外贸网站模板 Simplify WordPress外贸网站模板&#xff0c;简洁实用的外贸公司wordpress外贸建站模板。 查看演示 Invisible Trade WP外贸网站模板 WordPress Invisible Trade外贸网站模板&#xff0c;做进出口贸易公司官网的wordpress网站模板。 查看演…...

本地缓存Ehcache的应用实践 | 京东云技术团队

java本地缓存包含多个框架&#xff0c;其中常用的包括&#xff1a;Caffeine、Guava Cache和Ehcache&#xff0c; 其中Caffeine号称本地缓存之王&#xff0c;也是近年来被众多程序员推崇的缓存框架&#xff0c;同时也是SpringBoot内置的本地缓存实现。但是除了Caffeine之外&…...

linux一键换源

使用方法 - LinuxMirrors 使用方法 一键执行命令# 中国大陆&#xff08;默认&#xff09; 海外地区 bash <(curl -sSL https://linuxmirrors.cn/main.sh)-----------------------------------| ⡇ ⠄ ⣀⡀ ⡀⢀ ⡀⢀ ⡷⢾ ⠄ ⡀⣀ ⡀⣀ ⢀⡀ ⡀⣀ ⢀⣀ || ⠧⠤ ⠇ ⠇⠸ …...

Python Scapy库实现ARP扫描和ARP欺骗

ARP扫描&#xff1a;检测指定IP网段中哪些主机是在线的&#xff0c;并获取它们的MAC地址 from scapy.all import * import argparse import threading import time import logging # 解析CIDR格式的网段&#xff0c;并返回IP地址列表 # >接受一个CIDR格式的网段…...

Fink CDC数据同步(六)数据入湖Hudi

数据入湖Hudi Apache Hudi(简称&#xff1a;Hudi)使得您能在hadoop兼容的存储之上存储大量数据&#xff0c;同时它还提供两种原语&#xff0c;使得除了经典的批处理之外&#xff0c;还可以在数据湖上进行流处理。这两种原语分别是&#xff1a; Update/Delete记录&#xff1a;H…...

线程和进程的区别及基础线程创建

1 线程和进程的区别 资源分配和调度&#xff1a; 进程&#xff08;火车&#xff09;是操作系统进行资源分配和调度的最小单位。它有自己的独立资源空间&#xff0c;包括内存、文件句柄等。线程&#xff08;车厢&#xff09;是CPU调度的最小单位。一个进程可以包含多个线程&…...

如何使用postman进行接口调试

使用Postman进行接口调试 有些时候我们写代码的时候&#xff0c;会发现接口有报错&#xff0c;提示参数错误&#xff0c;我们为了更好的排查错误原因&#xff0c;可以在Postman上进行接口调试。将url&#xff0c;请求方式&#xff0c;参数&#xff0c;cookie都填写到Postman中…...

Leetcode 198 打家劫舍

题意理解&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代…...

相机图像质量研究(9)常见问题总结:光学结构对成像的影响--工厂镜头组装

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…...

Linux内核与驱动面试经典“小”问题集锦(5)

接前一篇文章&#xff1a;Linux内核与驱动面试经典“小”问题集锦&#xff08;4&#xff09; 问题6 问&#xff1a;mutex_lock和mutex_lock_interruptible的区别是什么&#xff1f; 备注&#xff1a;此问题也是笔者近期参加蔚来面试时遇到的一个问题。 答&#xff1a; 尽管…...

基于51 单片机的交通灯系统 源码+仿真+ppt

主要内容&#xff1a; 1&#xff09;南北方向的绿灯、东西方向的红灯同时亮40秒。 2&#xff09;南北方向的绿灯灭、黄灯亮5秒&#xff0c;同时东西方向的红灯继续亮。 3&#xff09;南北方向的黄灯灭、左转绿灯亮&#xff0c;持续20秒&#xff0c;同时东西方向的红灯继续…...

【蓝桥杯冲冲冲】[NOIP2017 提高组] 宝藏

蓝桥杯备赛 | 洛谷做题打卡day29 文章目录 蓝桥杯备赛 | 洛谷做题打卡day29[NOIP2017 提高组] 宝藏题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2提示题解代码我的一些话[NOIP2017 提高组] 宝藏 题目背景 NOIP2017 D2T2 题目描…...

C#中实现串口通讯和网口通讯(使用SerialPort和Socket类)

仅作自己学习使用 1 准备部份 串口通讯需要两个调试软件commix和Virtual Serial Port Driver&#xff0c;分别用于监视串口和创造虚拟串口。网口通讯需要一个网口调试助手&#xff0c;网络上有很多资源&#xff0c;我在这里采用的是微软商店中的TCP/UDP网络调试助手&#xff0…...

LeetCode回溯算法的解题思路

回溯法概念 回溯法&#xff1a;一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解被确认不是一个解&#xff08;或者至少不是最后一个解&#xff09;&#xff0c;回溯算法会通过在上一步进行一些变化抛弃该解&#xff0c;即回溯并且再次尝试。 应用场景 回溯算…...

泰克示波器(TBS2000系列)数学运算功能使用

目录 1 数学运算菜单1.1 运算符选择1.2 信源选择1.3 数学运算结果 1 数学运算菜单 Math运算按钮&#xff0c;用于实现对两个通道的信号进行实时的“加、减、乘”运算&#xff0c;计算时信源1在前面&#xff0c;信源2在运算符的右边&#xff0c;设置时设置信源与运算符就行了。…...

数据结构与算法之美学习笔记:50 | 索引:如何在海量数据中快速查找某个数据?

目录 前言为什么需要索引&#xff1f;索引的需求定义构建索引常用的数据结构有哪些&#xff1f;总结引申 前言 本节课程思维导图&#xff1a; 在第 48 节中&#xff0c;我们讲了 MySQL 数据库索引的实现原理。MySQL 底层依赖的是 B 树这种数据结构。留言里有同学问我&#xff…...

Python(SQLite)executescript用法

SQLite 数据库模块的游标对象还包含了一个 executescript() 方法&#xff0c;这不是一个标准的 API 方法&#xff0c;这意味着在其他数据库 API 模块中可能没有这个方法。但是这个方法却很实用&#xff0c;它可以执行一段 SQL 脚本。 例如&#xff0c;如下程序使用 executescr…...

BUUCTF-Real-[ThinkPHP]IN SQL INJECTION

目录 漏洞描述 漏洞分析 漏洞复现 漏洞描述 漏洞发现时间&#xff1a; 2018-09-04 CVE 参考&#xff1a;CVE-2018-16385 最高严重级别&#xff1a;低风险 受影响的系统&#xff1a;ThinkPHP < 5.1.23 漏洞描述&#xff1a; ThinkPHP是一款快速、兼容、简单的轻量级国产P…...

python安装步骤

安装 Python 的步骤如下&#xff1a; 在 Python 官方网站&#xff08;https://www.python.org&#xff09;上下载 Python 安装程序。运行下载的安装程序。在安装程序中选择要安装的 Python 版本&#xff08;通常选择最新版本&#xff09;&#xff0c;并选择安装目录。确保勾选…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...