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 | 执行统计文档数组。该数组包含每个候选计划的文档 |
candidatePlanScores | creationExecStats数组中列出的候选计划的得分数组 |
indexFilterSet | 布尔值,表示查询形状是否存在索引过滤器 |
estimatedSizeBytes | 计划缓存条目的估计大小(字节) |
host | mongod实例的主机名和端口号。当运行于分片集群时,操作返回每个分片副本集的信息,并使用分片和主机字段进行区分 |
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
执行查询时,MongoDB 查询规划器会根据可用索引选择并缓存效率最高的查询计划。$planCache可以返回所有集合的查询计划缓存信息。要使用$planCache,必须把$planCacheStats阶段放在管道最前面。 语法 { $planCacheStats: { } }使用 $planCacheStats必须…...
8个简约精美的WordPress外贸网站主题模板
Simplify WordPress外贸网站模板 Simplify WordPress外贸网站模板,简洁实用的外贸公司wordpress外贸建站模板。 查看演示 Invisible Trade WP外贸网站模板 WordPress Invisible Trade外贸网站模板,做进出口贸易公司官网的wordpress网站模板。 查看演…...
本地缓存Ehcache的应用实践 | 京东云技术团队
java本地缓存包含多个框架,其中常用的包括:Caffeine、Guava Cache和Ehcache, 其中Caffeine号称本地缓存之王,也是近年来被众多程序员推崇的缓存框架,同时也是SpringBoot内置的本地缓存实现。但是除了Caffeine之外&…...
linux一键换源
使用方法 - LinuxMirrors 使用方法 一键执行命令# 中国大陆(默认) 海外地区 bash <(curl -sSL https://linuxmirrors.cn/main.sh)-----------------------------------| ⡇ ⠄ ⣀⡀ ⡀⢀ ⡀⢀ ⡷⢾ ⠄ ⡀⣀ ⡀⣀ ⢀⡀ ⡀⣀ ⢀⣀ || ⠧⠤ ⠇ ⠇⠸ …...
Python Scapy库实现ARP扫描和ARP欺骗
ARP扫描:检测指定IP网段中哪些主机是在线的,并获取它们的MAC地址 from scapy.all import * import argparse import threading import time import logging # 解析CIDR格式的网段,并返回IP地址列表 # >接受一个CIDR格式的网段…...
Fink CDC数据同步(六)数据入湖Hudi
数据入湖Hudi Apache Hudi(简称:Hudi)使得您能在hadoop兼容的存储之上存储大量数据,同时它还提供两种原语,使得除了经典的批处理之外,还可以在数据湖上进行流处理。这两种原语分别是: Update/Delete记录:H…...
线程和进程的区别及基础线程创建
1 线程和进程的区别 资源分配和调度: 进程(火车)是操作系统进行资源分配和调度的最小单位。它有自己的独立资源空间,包括内存、文件句柄等。线程(车厢)是CPU调度的最小单位。一个进程可以包含多个线程&…...
如何使用postman进行接口调试
使用Postman进行接口调试 有些时候我们写代码的时候,会发现接口有报错,提示参数错误,我们为了更好的排查错误原因,可以在Postman上进行接口调试。将url,请求方式,参数,cookie都填写到Postman中…...
Leetcode 198 打家劫舍
题意理解: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代…...
相机图像质量研究(9)常见问题总结:光学结构对成像的影响--工厂镜头组装
系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...
Linux内核与驱动面试经典“小”问题集锦(5)
接前一篇文章:Linux内核与驱动面试经典“小”问题集锦(4) 问题6 问:mutex_lock和mutex_lock_interruptible的区别是什么? 备注:此问题也是笔者近期参加蔚来面试时遇到的一个问题。 答: 尽管…...
基于51 单片机的交通灯系统 源码+仿真+ppt
主要内容: 1)南北方向的绿灯、东西方向的红灯同时亮40秒。 2)南北方向的绿灯灭、黄灯亮5秒,同时东西方向的红灯继续亮。 3)南北方向的黄灯灭、左转绿灯亮,持续20秒,同时东西方向的红灯继续…...
【蓝桥杯冲冲冲】[NOIP2017 提高组] 宝藏
蓝桥杯备赛 | 洛谷做题打卡day29 文章目录 蓝桥杯备赛 | 洛谷做题打卡day29[NOIP2017 提高组] 宝藏题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2提示题解代码我的一些话[NOIP2017 提高组] 宝藏 题目背景 NOIP2017 D2T2 题目描…...
C#中实现串口通讯和网口通讯(使用SerialPort和Socket类)
仅作自己学习使用 1 准备部份 串口通讯需要两个调试软件commix和Virtual Serial Port Driver,分别用于监视串口和创造虚拟串口。网口通讯需要一个网口调试助手,网络上有很多资源,我在这里采用的是微软商店中的TCP/UDP网络调试助手࿰…...
LeetCode回溯算法的解题思路
回溯法概念 回溯法:一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化抛弃该解,即回溯并且再次尝试。 应用场景 回溯算…...
泰克示波器(TBS2000系列)数学运算功能使用
目录 1 数学运算菜单1.1 运算符选择1.2 信源选择1.3 数学运算结果 1 数学运算菜单 Math运算按钮,用于实现对两个通道的信号进行实时的“加、减、乘”运算,计算时信源1在前面,信源2在运算符的右边,设置时设置信源与运算符就行了。…...
数据结构与算法之美学习笔记:50 | 索引:如何在海量数据中快速查找某个数据?
目录 前言为什么需要索引?索引的需求定义构建索引常用的数据结构有哪些?总结引申 前言 本节课程思维导图: 在第 48 节中,我们讲了 MySQL 数据库索引的实现原理。MySQL 底层依赖的是 B 树这种数据结构。留言里有同学问我ÿ…...
Python(SQLite)executescript用法
SQLite 数据库模块的游标对象还包含了一个 executescript() 方法,这不是一个标准的 API 方法,这意味着在其他数据库 API 模块中可能没有这个方法。但是这个方法却很实用,它可以执行一段 SQL 脚本。 例如,如下程序使用 executescr…...
BUUCTF-Real-[ThinkPHP]IN SQL INJECTION
目录 漏洞描述 漏洞分析 漏洞复现 漏洞描述 漏洞发现时间: 2018-09-04 CVE 参考:CVE-2018-16385 最高严重级别:低风险 受影响的系统:ThinkPHP < 5.1.23 漏洞描述: ThinkPHP是一款快速、兼容、简单的轻量级国产P…...
python安装步骤
安装 Python 的步骤如下: 在 Python 官方网站(https://www.python.org)上下载 Python 安装程序。运行下载的安装程序。在安装程序中选择要安装的 Python 版本(通常选择最新版本),并选择安装目录。确保勾选…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
