深入浅出MongoDB(七)
深入浅出MongoDB(七)
文章目录
- 深入浅出MongoDB(七)
- 查询优化
- 创建索引以支持读取操作
- 查询选择性
- 覆盖查询
- 分析性能
- 使用数据库分析器评估对数据库的操作
- 使用`db.currentOp()`评估mongod操作
- 使用explain评估查询性能
- 优化查询性能
- 创建索引以支持查询
- 限制查询结果数量以减少网络请求
- 使用投影仅返回必要的数据
- 使用$hint选择特定索引
- 使用增量运算符执行服务器端操作
查询优化
创建索引以支持读取操作
- 当应用程序对特定字段或一组字段的集合进行查询时,查询字段上的索引或字段集的复合索引可能会阻止查询操作扫描整个集合以查找和返回查询结果。
# 示例查询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"}
]
查询选择性
- 查询选择性是指查询谓词排除或过滤出集合中文档的程序,可以确定查询能够有效地使用索引,或者根本不适用索引。
- 选择性更强的查询匹配的文档比例更小;选择性较低的查询会匹配更大比例的文档,无法有效的使用索引或者根本不适用索引。
- 正则表达式的选择性取决于表达式本身。
覆盖查询
- 覆盖查询是可以完全使用索引来满足并且不必检查任何文档的查询。
- 满足以下所以条件时,索引会覆盖查询
- 查询中的所有字段都是索引的一部分,并且结果中所有的字段都位于同一索引中;
- 查询中没有字段等于null(
field:null
或field:{$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}
)
- 索引可以涵盖对嵌入式文档中字段的查询,给嵌入式文档中的字段编制索引,使用点符号
# 示例集合userdata形式如下
{_id: 1, user: {login: 'tester'}}
# 包含以下索引可以覆盖查询
{'user.login': 1}
db.userdata.find({'user.login': 'tester'}, {'user.login': 1, _id: 0})
- 多键索引如果要追踪哪个或哪些字段致使其成为多键,则其可涵盖对非数组字段的查询。多键索引不能涵盖对数组字段的查询。
- 由于索引包含查询所需的所有字段,所以mongodb可以只是用索引来匹配查询条件并返回结果。仅查询索引比查询索引之外的文档要快的多。索引键通常小于它们编目的文档,并且索引通常在RAM中可用或按顺序存储在磁盘上。
- 带索引字段的限制包括地理空间索引不能覆盖查询,多键索引不能涵盖对数组字段的查询。在mongos上运行时,如果索引包含分片键,则索引只能涵盖对分片集合的查询。
分析性能
使用数据库分析器评估对数据库的操作
-
mongodb提供了一个数据库分析器,可以显示针对数据库的每个操作的性能特征。使用分析器查找任何运行缓慢的查询或写入操作。分析器对其手机的所有数据写入每个被分析数据库中的
system.profile
集合,这时一种固定大小集合。 -
读写操作的分析器条目和诊断日志消息包括以下内容
- queryHash帮助识别具有相同查询结构的慢速查询。
- planCacheKey提供对慢速查询的查询计划缓存的更多见解。
- 副本集的从节点会记录应用事件超过慢操作域值的oplog条目。oplog消息包括以下内容。
- 在诊断日志中针对从节点记录;
- 记录在REPL组件下,该组件含有文本
applied op: <oplog entry> took <num>ms
; - 不依赖日志级别和分析级别,受
slowOpSampleRate
影响。
-
默认情况下,分析器为off关闭状态,我们可以按数据库或按实例启用分析器并设置分析级别。启用分析功能后,会影响数据库性能和磁盘使用情况。
-
分析级别
等级0:分析器已关闭,因此不收集任何数据,这是默认的分析器级别。
等级1:分析器会收集用时超过slowms值或与某一筛选器匹配的操作的对应数据。
等级2:该分析器回收机所有操作的数据。
- 使用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)
- 查看分析器数据
# 数据库分析器在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
-
分析器开销
启用后分析会影响数据库性能,还会消耗磁盘空间,
system.profile
集合是一个固定大小集合,默认为1MB。
使用db.currentOp()
评估mongod操作
db.currentOp()
方法会报告mongod实例上运行的当前操作。
使用explain评估查询性能
-
我们可以在queryPlanner模式、executionStats模式或allPlansExecution模式下运行explain方法来控制返回的信息量。
-
explain结果将查询计划显示为阶段树,每个阶段都会传递其结果复制到父节点。叶节点访问权限集合或索引。内部节点操作由子节点产生的文档或索引键。节点是mongodb派生结果设立的最后阶段。阶段是对操作的描述。
- COLLSCAN用于集合扫描
- IXSCAN用于扫描索引键
- FETCH用于检索文档
- SHARD_MERGE用于合并来自分片的结果
- SHARDING_FILTER用于从分片中过滤掉孤立文档
"winningPlan" : {"stage" : <STAGE1>,..."inputStage" : {"stage" : <STAGE2>,..."inputStage" : {"stage" : <STAGE3>,...}}
},
- 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>,...]
}
- 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" : {...}}}},...]
}
-
对于索引相交计划,结果将包括AND_SORTED阶段或AND_HASH阶段,以及详细说明索引的inputStages数组。
-
如果
$or
表达式使用索引,那么结果将包括OR阶段和一个详细说明索引的inputStagtes数组。 -
当explain在ExecutionStats或AllplansExecution详细模式下运行时,
$sort
和$group
阶段会有额外的输出。
阶段 | 字段 | 类型 | 说明 |
---|---|---|---|
$sort | totalDataSizeSortedBytesEstimate | long | $sort阶段处理的字节估计数 |
$sort | usedDisk | 布尔 | $osrt阶段是否已写入磁盘 |
$group | totalOutputDataSizeBytes | long | $group阶段输出的所有文档总大小的估计值 |
$group | usedDisk | 布尔 | $group阶段是否已写入磁盘 |
优化查询性能
创建索引以支持查询
- 对于常用查询,创建索引。如果查询会搜索多个字段,需要使用复合索引。扫描索引比扫描集合快得多,索引结构小于文档引用,并按顺序存储引用。索引还能提高定期对字段进行排序的查询的效率。
- 索引支持查询、更新操作和聚合管道的某些阶段。
限制查询结果数量以减少网络请求
- mongodb游标以多个文档群组的形式返回结果,通过排序操作和
limit()
方法集合使用。
使用投影仅返回必要的数据
- 如果只需要文档中的部分字段,就可以通过仅返回所需要的字段来实现更优性能。
使用$hint选择特定索引
- 大多数情况下,查询优化器会为特定操作选择最佳索引,但是我们可以使用
hint()
方法强制使用特定索引。
使用增量运算符执行服务器端操作
- 使用
$inc
运算符来递增或递减文档中的值。作为选择文档操作的替代方法,此运算符会在服务器端递增该字段的值,从而在客户端进行建议修改,然后将整个文档写入服务器。
相关文章:
深入浅出MongoDB(七)
深入浅出MongoDB(七) 文章目录 深入浅出MongoDB(七)查询优化创建索引以支持读取操作查询选择性覆盖查询 分析性能使用数据库分析器评估对数据库的操作使用db.currentOp()评估mongod操作使用explain评估查询性能 优化查询性能创建索…...

【华为】配置NAT访问互联网
1.AR1: 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)配置默认路由: ip route-static 0.0.0.0 0.…...
Spring Boot项目使用多线程执行定时任务
我在一个Spring Boot项目中,采用定时器执行一些操作,比如10秒就发送一次数据。这些操作有2个,如下所示。我就想,虽然这两个操作各自指定了时间频率,但如果其中一个操作非常耗时,会不会影响其他操作呢&#…...

【安装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 前言 在软件开发中,Android应用开发通常使用Android Studio,但…...

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

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

关于OceanBase数据库的poc测试连接经验(by liuhui)
poc客户给了OceanBase数据库实例如下 ob实例: ip:1xx.xx.xx 端口:2883 实例名:obm_xczjj_1_poc#cs_pool_1 用户名:root 密码:xxxxxx 问题出现:根据客户提供的OceanBase数据库配置报错。配置如下 查询数据…...
Docker部署如何修改本地mysql,redis连接信息
要修改数据库 MySQL 和缓存 Redis 的地址为 ruoyi-mysql 和 ruoyi-redis,通常需要在 Spring Boot 项目的配置文件中进行相应的修改。 ### 修改 MySQL 数据库地址为 ruoyi-mysql 1. **在 Spring Boot 项目中找到 application.properties 或 application.yml 文件**…...
PHP中的ReflectionClass常见用法
ReflectionClass是 PHP 中的一个类,它提供了有关类的信息的反射。 使用ReflectionClass可以在运行时获取关于类的各种信息,例如类的名称、方法、属性、注释等。 以下是一些常见的用法: 获取类的名称: $reflection new Reflec…...

processing像素画教程
前提:各位已经安装了processing 第一步:创建一个简单的网格 我们首先创建一个网格来定义我们作品的像素画布。网格将帮助您在适当的位置绘制每个像素。 int gridSize 20; // 每个像素的大小 int cols, rows; void setup() {size(400, 400); // 设置画…...
【秋招笔试】10.13字节跳动(已改编)秋招-三语言题解
🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 本次的三题全部上线…...

牛客网上最全的Java八股文整理,涵盖Java全栈技术点
Java 面试 “金九银十”这个字眼对于程序员应该是再熟悉不过的了,每年的金九银十都会有很多程序员找工作、跳槽等一系列的安排。说实话,面试中 7 分靠能力,3 分靠技能;在刚开始的时候介绍项目都是技能中的重中之重,它…...

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

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

利士策分享,从“亮剑精神”汲取财富智慧
利士策分享,从“亮剑精神”汲取财富智慧 在某一广袤区域内,一场寓意深远的活动正如火如荼地展开,它不仅象征着直面挑战的勇气,更隐含着经济社会发展的深层启示。 对于广大民众来说,这场活动背后所传达的理念与机遇&am…...
【JavaScript】关于使用JS对word文档实现预览的一些思考
文章目录 mammothdocx4js mammoth 官网地址:https://github.com/mwilliamson/mammoth.js#readme 安装mammoth: npm i mammoth -S我们可以安装mammoth来实现上传的word文件的在线预览,我们以element的上传组件为示例: <temp…...

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

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

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

一款强大灵活的流程图引擎,支持React 和 Svelte 框架
大家好,今天给大家分享一个专注于处理流程可视化和交互的项目xyflow。它旨在为开发者和用户提供一种直观、高效的方式来表示、管理和操作各种流程。 项目介绍 xyflow是一款强大灵活的流程图引擎。该项目是用于构建基于节点的编辑器和交互式图表,支持 Re…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...