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

深入浅出MongoDB(七)

深入浅出MongoDB(七)

文章目录

    • 深入浅出MongoDB(七)
      • 查询优化
        • 创建索引以支持读取操作
        • 查询选择性
        • 覆盖查询
      • 分析性能
        • 使用数据库分析器评估对数据库的操作
        • 使用`db.currentOp()`评估mongod操作
        • 使用explain评估查询性能
      • 优化查询性能
        • 创建索引以支持查询
        • 限制查询结果数量以减少网络请求
        • 使用投影仅返回必要的数据
        • 使用$hint选择特定索引
        • 使用增量运算符执行服务器端操作

查询优化

创建索引以支持读取操作
  1. 当应用程序对特定字段或一组字段的集合进行查询时,查询字段上的索引或字段集的复合索引可能会阻止查询操作扫描整个集合以查找和返回查询结果。
# 示例查询inventory集合中的type字段
var typeValue = <someUserInput>;
db.inventory.find({type: typeValue});
# 要提高查询的性能,可以给type字段添加升序或降序索引,防止对type的查询扫描整个集合
db.inventory.createIndex({type: 1})
# inventory中的文档结构如下
[{"_id": 1,"item": "f1","quantity": 500,"type": "food"}
]
查询选择性
  1. 查询选择性是指查询谓词排除或过滤出集合中文档的程序,可以确定查询能够有效地使用索引,或者根本不适用索引。
  2. 选择性更强的查询匹配的文档比例更小;选择性较低的查询会匹配更大比例的文档,无法有效的使用索引或者根本不适用索引。
  3. 正则表达式的选择性取决于表达式本身。
覆盖查询
  1. 覆盖查询是可以完全使用索引来满足并且不必检查任何文档的查询。
  2. 满足以下所以条件时,索引会覆盖查询
  • 查询中的所有字段都是索引的一部分,并且结果中所有的字段都位于同一索引中;
  • 查询中没有字段等于null(field:nullfield:{$eq:null})
# 在inventory集合的type和item字段建立索引
db.inventory.createIndex({type: 1, item: 1})
# 查询type和item字段并且仅返回item字段,为了使索引覆盖查询,投影文档必须指定_id:0从结果中排除_id字段
db.inventory.find({type: 'food', item: '/^c/'},{item: 1, _id: 0}
)
  1. 索引可以涵盖对嵌入式文档中字段的查询,给嵌入式文档中的字段编制索引,使用点符号
# 示例集合userdata形式如下
{_id: 1, user: {login: 'tester'}}
# 包含以下索引可以覆盖查询
{'user.login': 1}
db.userdata.find({'user.login': 'tester'}, {'user.login': 1, _id: 0})
  1. 多键索引如果要追踪哪个或哪些字段致使其成为多键,则其可涵盖对非数组字段的查询。多键索引不能涵盖对数组字段的查询。
  2. 由于索引包含查询所需的所有字段,所以mongodb可以只是用索引来匹配查询条件并返回结果。仅查询索引比查询索引之外的文档要快的多。索引键通常小于它们编目的文档,并且索引通常在RAM中可用或按顺序存储在磁盘上。
  3. 带索引字段的限制包括地理空间索引不能覆盖查询,多键索引不能涵盖对数组字段的查询。在mongos上运行时,如果索引包含分片键,则索引只能涵盖对分片集合的查询。

分析性能

使用数据库分析器评估对数据库的操作
  1. mongodb提供了一个数据库分析器,可以显示针对数据库的每个操作的性能特征。使用分析器查找任何运行缓慢的查询或写入操作。分析器对其手机的所有数据写入每个被分析数据库中的system.profile集合,这时一种固定大小集合。

  2. 读写操作的分析器条目和诊断日志消息包括以下内容

  • queryHash帮助识别具有相同查询结构的慢速查询。
  • planCacheKey提供对慢速查询的查询计划缓存的更多见解。
  1. 副本集的从节点会记录应用事件超过慢操作域值的oplog条目。oplog消息包括以下内容。
  • 在诊断日志中针对从节点记录;
  • 记录在REPL组件下,该组件含有文本applied op: <oplog entry> took <num>ms
  • 不依赖日志级别和分析级别,受slowOpSampleRate影响。
  1. 默认情况下,分析器为off关闭状态,我们可以按数据库或按实例启用分析器并设置分析级别。启用分析功能后,会影响数据库性能和磁盘使用情况。

  2. 分析级别

等级0:分析器已关闭,因此不收集任何数据,这是默认的分析器级别。
等级1:分析器会收集用时超过slowms值或与某一筛选器匹配的操作的对应数据。
等级2:该分析器回收机所有操作的数据。
  1. 使用mongosh辅助程序db.setProfilingLevel()来启用分析。当启用分析时,设置分析级别大于0,分析器会将数据记录在system.profile集合中。
# slowms和sampleRate分析设置为全局设置,影响进程中的所有数据库
# profile命令或db.setProfilingLevel()设置时,在数据库级别设置分析级别和筛选器设置,对数据分析器level、slowms、sampleRate或filter所做的更改会记录在log file中,slowms和sampleRate分析设置为全局设置,设置后会影响进程中的所有数据库
db.setProfilingLevel(2)
# 默认情况下,慢操作域值为100ms,使用profile命令或db.setProfilingLevel()方法设置slowms的值,启动时使用命令行参数--slowms设置,在配置文件中设置slowOpThresholdMs的值
db.setProfilingLevel(1, {slowms: 20})
# 分析器记录耗时超过2s的query操作
db.setProfilingLevel(2, {filter:{op:"query", millis:{$gt:2000}}})
# 查看分析级别
db.getProfilingStatus()
# 禁用性能分析
db.setProfilingLevel(0)
  1. 查看分析器数据
# 数据库分析器在system.profile集合中记录有关数据库操作的信息
# 查询system.profile集合中最近的10个日志条目
db.system.profile.find().limit(10).sort({ts:-1}).pretty()
# 返回除命令操作$cmd以外的所有操作
db.system.profile.find({op:{$ne:'command'}}).pretty()
# 返回某一时间范围的信息
db.system.profile.find({ts: {$gt: new ISODate("2012-12-09T03:00:00Z"),$lt: new ISODate("2012-12-09T03:40:00Z")
}}).pretty()
# 显示最近的五个事件
show profile
  1. 分析器开销

    启用后分析会影响数据库性能,还会消耗磁盘空间,system.profile集合是一个固定大小集合,默认为1MB。

使用db.currentOp()评估mongod操作
  1. db.currentOp()方法会报告mongod实例上运行的当前操作。
使用explain评估查询性能
  1. 我们可以在queryPlanner模式、executionStats模式或allPlansExecution模式下运行explain方法来控制返回的信息量。

  2. explain结果将查询计划显示为阶段树,每个阶段都会传递其结果复制到父节点。叶节点访问权限集合或索引。内部节点操作由子节点产生的文档或索引键。节点是mongodb派生结果设立的最后阶段。阶段是对操作的描述。

  • COLLSCAN用于集合扫描
  • IXSCAN用于扫描索引键
  • FETCH用于检索文档
  • SHARD_MERGE用于合并来自分片的结果
  • SHARDING_FILTER用于从分片中过滤掉孤立文档
"winningPlan" : {"stage" : <STAGE1>,..."inputStage" : {"stage" : <STAGE2>,..."inputStage" : {"stage" : <STAGE3>,...}}
},
  1. queryPlanner信息详细说明了查询优化器选择的计划,以未分片的集合为例。
"queryPlanner" : {"plannerVersion" : <int>,# 一个字符串,使用数据库名称和查询访问的集合,<database>.<collection>"namespace" : <string>,# 指定了是否对查询结构应用了索引筛选器"indexFilterSet" : <boolean>,"parsedQuery" : {...},# 十六进制字符串,表示查询结构的哈希值"queryHash" : <hexadecimal string>,# 与此查询关联的计划缓存条目的键的哈希值"planCacheKey" : <hexadecimal string>,# 表明整个聚合管道操作已被优化掉,改用查询计划执行阶段树来实现"optimizedPipeline" : <boolean>, // Starting in MongoDB 4.2, only appears if true# 详细说明查询优化器所选计划的文档"winningPlan" : {# 阶段名称"stage" : <STAGE1>,...# 描述该子阶段的文档"inputStage" : {"stage" : <STAGE2>,..."inputStage" : {...}}},# 查询优化器考虑和拒绝的候选计划数组"rejectedPlans" : [<candidate plan 1>,...]
}
  1. executionStats信息详细说明了获胜计划的执行情况,以未分片的集合为例。
"executionStats" : {"executionSuccess" : <boolean>,# 获胜查询计划返回的文档数"nReturned" : <int>,# 选择查询计划和执行查询所需的总时间"executionTimeMillis" : <int>,# 扫描的索引项数"totalKeysExamined" : <int>,# 查询执行过程中检查的文档数量"totalDocsExamined" : <int>,# 以阶段树的形式详细说明获胜计划的执行情况"executionStages" : {   "stage" : <STAGE1>"nReturned" : <int>,# 查询执行的估计时间"executionTimeMillisEstimate" : <int>,# 指定查询执行阶段的工作单元数量"works" : <int>,# 此阶段返回到其父阶段的中间结果的数量"advanced" : <int>,# 未将中间结果推进到其父阶段的工作周期数"needTime" : <int>,# 存储层请求查询阶段暂停处理并让出其锁的次数"needYield" : <int>,# 查询阶段暂停处理并保存其当前执行状态的次数"saveState" : <int>,# 查询阶段恢复了已保存的执行状态的次数"restoreState" : <int>,# 指定执行阶段是否已到达流结束"isEOF" : <boolean>,..."inputStage" : {"stage" : <STAGE2>,"nReturned" : <int>,"executionTimeMillisEstimate" : <int>,..."inputStage" : {...}}},"allPlansExecution" : [{"nReturned" : <int>,"executionTimeMillisEstimate" : <int>,"totalKeysExamined" : <int>,"totalDocsExamined" :<int>,"executionStages" : {"stage" : <STAGEA>,"nReturned" : <int>,"executionTimeMillisEstimate" : <int>,..."inputStage" : {"stage" : <STAGEB>,..."inputStage" : {...}}}},...]
}
  1. 对于索引相交计划,结果将包括AND_SORTED阶段或AND_HASH阶段,以及详细说明索引的inputStages数组。

  2. 如果$or表达式使用索引,那么结果将包括OR阶段和一个详细说明索引的inputStagtes数组。

  3. 当explain在ExecutionStats或AllplansExecution详细模式下运行时,$sort$group阶段会有额外的输出。

阶段字段类型说明
$sorttotalDataSizeSortedBytesEstimatelong$sort阶段处理的字节估计数
$sortusedDisk布尔$osrt阶段是否已写入磁盘
$grouptotalOutputDataSizeByteslong$group阶段输出的所有文档总大小的估计值
$groupusedDisk布尔$group阶段是否已写入磁盘

优化查询性能

创建索引以支持查询
  1. 对于常用查询,创建索引。如果查询会搜索多个字段,需要使用复合索引。扫描索引比扫描集合快得多,索引结构小于文档引用,并按顺序存储引用。索引还能提高定期对字段进行排序的查询的效率。
  2. 索引支持查询、更新操作和聚合管道的某些阶段。
限制查询结果数量以减少网络请求
  1. mongodb游标以多个文档群组的形式返回结果,通过排序操作和limit()方法集合使用。
使用投影仅返回必要的数据
  1. 如果只需要文档中的部分字段,就可以通过仅返回所需要的字段来实现更优性能。
使用$hint选择特定索引
  1. 大多数情况下,查询优化器会为特定操作选择最佳索引,但是我们可以使用hint()方法强制使用特定索引。
使用增量运算符执行服务器端操作
  1. 使用$inc运算符来递增或递减文档中的值。作为选择文档操作的替代方法,此运算符会在服务器端递增该字段的值,从而在客户端进行建议修改,然后将整个文档写入服务器。

相关文章:

深入浅出MongoDB(七)

深入浅出MongoDB&#xff08;七&#xff09; 文章目录 深入浅出MongoDB&#xff08;七&#xff09;查询优化创建索引以支持读取操作查询选择性覆盖查询 分析性能使用数据库分析器评估对数据库的操作使用db.currentOp()评估mongod操作使用explain评估查询性能 优化查询性能创建索…...

【华为】配置NAT访问互联网

1.AR1&#xff1a; int g0/0/0 ip ad 64.1.1.2 255.255.255.0 int g0/0/1 ip ad 110.242.68.1 255.255.255.02.AR2: (1)配置端口ip: int g0/0/1 ip ad 10.3.1.2 255.255.255.0 int g0/0/0 ip ad 64.1.1.1 255.255.255.0(2)配置默认路由&#xff1a; ip route-static 0.0.0.0 0.…...

Spring Boot项目使用多线程执行定时任务

我在一个Spring Boot项目中&#xff0c;采用定时器执行一些操作&#xff0c;比如10秒就发送一次数据。这些操作有2个&#xff0c;如下所示。我就想&#xff0c;虽然这两个操作各自指定了时间频率&#xff0c;但如果其中一个操作非常耗时&#xff0c;会不会影响其他操作呢&#…...

【安装JDK和Android SDK】

安装JDK和Android SDK 1 前言2 下载2.1 下载途径2.2 JDK下载和安装2.2.1 下载2.2.2 安装并配置环境变量2.2.3 验证 2.3 SDK下载和安装2.3.1 下载2.3.2 安装2.3.3 环境变量配置2.3.4 验证 1 前言 在软件开发中&#xff0c;Android应用开发通常使用Android Studio&#xff0c;但…...

汇总10个AI免费一键生成PPT的网站

一、前言 PPT幻灯片是现代办公和学习中的重要组成部分。它在工作、研究或培训中扮演着重要角色&#xff0c;并能够让观众更好地理解信息。随着当今人工智能技术的快速发展&#xff0c;现在有很多免费的AI PPT生成器可供选择&#xff0c;帮助用户更加便捷地制作出高效且具有较强…...

超材料光子晶体和禁带分析实例_CST电磁仿真教程

光子晶体是由周期性排列的不同折射率的介质制造的光学结构&#xff0c;可被视为广义超材料metamaterial的一种。本期我们演示设计一个基于光频能带(PBG,photonics band gap) 的二维光子晶体波导&#xff0c;能带分析方法也可适用于微波波段&#xff08;EBG,electromagetic band…...

关于OceanBase数据库的poc测试连接经验(by liuhui)

poc客户给了OceanBase数据库实例如下 ob实例&#xff1a; ip:1xx.xx.xx 端口&#xff1a;2883 实例名&#xff1a;obm_xczjj_1_poc#cs_pool_1 用户名&#xff1a;root 密码&#xff1a;xxxxxx 问题出现&#xff1a;根据客户提供的OceanBase数据库配置报错。配置如下 查询数据…...

Docker部署如何修改本地mysql,redis连接信息

要修改数据库 MySQL 和缓存 Redis 的地址为 ruoyi-mysql 和 ruoyi-redis&#xff0c;通常需要在 Spring Boot 项目的配置文件中进行相应的修改。 ### 修改 MySQL 数据库地址为 ruoyi-mysql 1. **在 Spring Boot 项目中找到 application.properties 或 application.yml 文件**…...

PHP中的ReflectionClass常见用法

ReflectionClass是 PHP 中的一个类&#xff0c;它提供了有关类的信息的反射。 使用ReflectionClass可以在运行时获取关于类的各种信息&#xff0c;例如类的名称、方法、属性、注释等。 以下是一些常见的用法&#xff1a; 获取类的名称&#xff1a; $reflection new Reflec…...

processing像素画教程

前提&#xff1a;各位已经安装了processing 第一步&#xff1a;创建一个简单的网格 我们首先创建一个网格来定义我们作品的像素画布。网格将帮助您在适当的位置绘制每个像素。 int gridSize 20; // 每个像素的大小 int cols, rows; void setup() {size(400, 400); // 设置画…...

【秋招笔试】10.13字节跳动(已改编)秋招-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 本次的三题全部上线…...

牛客网上最全的Java八股文整理,涵盖Java全栈技术点

Java 面试 “金九银十”这个字眼对于程序员应该是再熟悉不过的了&#xff0c;每年的金九银十都会有很多程序员找工作、跳槽等一系列的安排。说实话&#xff0c;面试中 7 分靠能力&#xff0c;3 分靠技能&#xff1b;在刚开始的时候介绍项目都是技能中的重中之重&#xff0c;它…...

Skyeye 云智能制造 v3.14.9 发布,ERP 商城 + AI

Skyeye 云智能制造&#xff0c;采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程&#xff0c;CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…...

Element-快速入门

什么是 Element 在现代前端开发中&#xff0c;组件化的思想日益盛行&#xff0c;Element组件库作为一款流行的UI组件库&#xff0c;特别适用于基于Vue.js的项目&#xff0c;它为开发者提供了丰富的组件和良好的开发体验。 想要使用Element的组件库&#xff0c;我们需要完成下面…...

利士策分享,从“亮剑精神”汲取财富智慧

利士策分享&#xff0c;从“亮剑精神”汲取财富智慧 在某一广袤区域内&#xff0c;一场寓意深远的活动正如火如荼地展开&#xff0c;它不仅象征着直面挑战的勇气&#xff0c;更隐含着经济社会发展的深层启示。 对于广大民众来说&#xff0c;这场活动背后所传达的理念与机遇&am…...

【JavaScript】关于使用JS对word文档实现预览的一些思考

文章目录 mammothdocx4js mammoth 官网地址&#xff1a;https://github.com/mwilliamson/mammoth.js#readme 安装mammoth&#xff1a; npm i mammoth -S我们可以安装mammoth来实现上传的word文件的在线预览&#xff0c;我们以element的上传组件为示例&#xff1a; <temp…...

安宝特方案 | AR技术在轨交行业的应用优势

随着轨道交通行业不断向智能化和数字化转型&#xff0c;传统巡检方式的局限性日益凸显。而安宝特AR眼镜以其独特的佩戴方式和轻便设计&#xff0c;为轨道交通巡检领域注入了创新活力&#xff0c;提供了全新的解决方案。 01 多样化佩戴方法&#xff0c;完美适应户外环境 安宝特…...

K8S配置MySQL主从自动水平扩展

前提环境 操作系统Ubuntu 22.04 K8S 1.28.2集群&#xff08;1个master2个node&#xff09; MySQL 5.7.44部署在K8S的主从集群 metrics-server v0.6.4 概念简介 在K8s中扩缩容分为两种 ●Node层面&#xff1a;对K8s物理节点扩容和缩容&#xff0c;根据业务规模实现物理节点自动扩…...

Excel:将一列拆分成多列

实现的效果是&#xff1a; 操作步骤如下&#xff1a; 1.选中列 → 点击菜单栏中的"数据" → 分列 2.选择"分列符号"&#xff0c;点击下一步 3.我想要按照空格分列&#xff0c;就选择空格 4.点击完成&#xff0c;就可以实现分列的效果了...

一款强大灵活的流程图引擎,支持React 和 Svelte 框架

大家好&#xff0c;今天给大家分享一个专注于处理流程可视化和交互的项目xyflow。它旨在为开发者和用户提供一种直观、高效的方式来表示、管理和操作各种流程。 项目介绍 xyflow是一款强大灵活的流程图引擎。该项目是用于构建基于节点的编辑器和交互式图表&#xff0c;支持 Re…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析

1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器&#xff08;TI&#xff09;推出的一款 汽车级同步降压转换器&#xff08;DC-DC开关稳压器&#xff09;&#xff0c;属于高性能电源管理芯片。核心特性包括&#xff1a; 输入电压范围&#xff1a;2.95V–6V&#xff0c;输…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解

文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...