MongoDB慢日志查询及索引创建

        MongoDB 的慢日志(Slow Query Log)对于运维和程序员来说都非常重要,因为它直接关系到数据库的性能和应用程序的稳定性。以下分享介绍下MongoDB慢日志查询及索引创建相关的一些笔记。

一,准备

1. 使用 db.currentOp() 实时监控

db.currentOp() 可以查看当前正在执行的操作,适合捕捉瞬时的高 CPU 操作。

db.currentOp()

示例:过滤长时间运行的操作

db.currentOp({ "secs_running": { "$gt": 1 } }) // 过滤运行时间超过 1 秒的操作

关键字段:

  • opid:操作 ID。

  • op:操作类型(如 queryupdatecommand 等)。

  • ns:操作的命名空间(数据库和集合)。

  • secs_running:操作已经运行的时间(秒)。

  • planSummary:操作的执行计划摘要。

  • locks:操作持有的锁信息。

2.  查询当前 profiling 状态

运行以下命令:

db.getProfilingStatus()

输出示例:

{"was": 1,"slowms": 100,"sampleRate": 1.0
}
  • was:当前的 profiling 级别。

    • 0:关闭 profiling。

    • 1:记录慢查询。

    • 2:记录所有查询。

  • slowms:当前的慢查询阈值(单位:毫秒)。

  • sampleRate:采样率(MongoDB 4.4+ 引入),表示记录慢查询的比例(默认为 1.0,即 100%)。

 解释输出

slowms: 100:表示当前慢查询阈值为 100 毫秒。任何执行时间超过 100 毫秒的查询都会被记录到 system.profile 集合中。

was: 1:表示当前 profiling 级别为 1,即只记录慢查询。

 

3. 修改慢查询阈值

如果你想修改慢查询阈值,可以使用 db.setProfilingLevel() 方法。例如,将阈值改为 200 毫秒:

db.setProfilingLevel(1, { slowms: 200 })

这代表会记录执行时间超过200毫秒的语句。

然后让 MongoDB 运行一段时间,以便收集足够的慢查询数据。这段时间可以根据你的系统负载和查询频率来决定。 

4. 查询 profiling 级别

如果你只想查询当前的 profiling 级别(而不关心阈值),可以使用以下命令:

db.getProfilingLevel()

输出示例:

1
  • 0:关闭 profiling。

  • 1:记录慢查询。

  • 2:记录所有查询。

 二、查询慢SQL

1.查询语句

db.system.profile.find().sort({ ts: -1 }).limit(10)

 2.过滤 millis 大于 3000 的查询

运行以下命令

db.system.profile.find({ millis: { $gt: 3000 } }).sort({ ts: -1 })
  • { millis: { $gt: 3000 } }:筛选 millis 大于 3000 的文档。

  • .sort({ ts: -1 }):按时间戳倒序排列,确保最新的查询排在最前面。

3. 进一步筛选

如果你只想查看特定类型的操作(如 query 或 aggregate),可以在查询中添加额外的过滤条件。例如:

  • 只查看 query 操作:

    db.system.profile.find({ op: "query", millis: { $gt: 3000 } }).sort({ ts: -1 })
  • 只查看 aggregate 操作:
db.system.profile.find({ op: "command", "command.aggregate": { $exists: true }, millis: { $gt: 3000 } }).sort({ ts: -1 })

4. 限制返回结果数量

如果结果较多,可以使用 limit 限制返回的文档数量。例如,只返回前 10 条:

db.system.profile.find({ millis: { $gt: 3000 } }).sort({ ts: -1 }).limit(10)

5.查询指定日期时间的记录

假设你想查询 2023-10-01T12:00:00Z 之后的记录,可以使用以下命令: 

db.system.profile.find({ts: { $gt: ISODate("2023-10-01T12:00:00Z") }
}).sort({ ts: -1 }).limit(10)

如果你希望查询某个特定日期时间范围内的记录,可以结合 $gt 和 $lt 操作符。

示例:查询 2023-10-01T12:00:00Z 到 2023-10-02T12:00:00Z 之间的记录

db.system.profile.find({ts: {$gt: ISODate("2023-10-01T12:00:00Z"),$lt: ISODate("2023-10-02T12:00:00Z")}
}).sort({ ts: -1 }).limit(10);

6.慢查询日志的字段说明

db.system.profile.find() 返回的文档中,以下字段最为关键:

字段名说明
op操作类型(如 queryupdateinsert 等)。
ns操作的命名空间(格式为 数据库名.集合名)。
command具体的查询或命令内容(如 findaggregate 等)。
millis查询执行时间(单位:毫秒)。
planSummary查询的执行计划摘要(如使用的索引)。
ts查询执行的时间戳。
keysExamined扫描的索引键数量。
docsExamined扫描的文档数量。
nreturned返回的文档数量。
locks锁信息(如锁类型和持有时间)。

7. 注意事项

  • system.profile 集合的大小:system.profile 是一个 capped collection(固定大小集合),默认大小较小。如果需要更长时间的日志,可以调整其大小:

    db.setProfilingLevel(0); // 先关闭 profiling
    db.system.profile.drop();
    db.createCollection("system.profile", { capped: true, size: 1048576 }); // 设置新的大小(单位:字节)
    db.setProfilingLevel(1, { slowms: 100 }); // 重新启用 profiling
  • 性能影响:启用 profiling 会对性能有一定影响,建议在生产环境中谨慎使用。

三、创建索引

1.创建

针对以上捞出来的慢SQL语句,可以添加相应的索引

db.mytable.createIndex({ field1: 1, field2: 1 })

值1是对field1字段创建升序索引。 

 2.验证

创建索引后,可以使用 explain 方法验证查询是否使用了新创建的索引。

db.mytable.find({ ‌field1: 'abc', ‌field2: '2025-03-19' }
).limit(1).explain("executionStats")

检查输出中的以下字段:

  • winningPlan.inputStage.indexName:确认是否使用了新创建的索引。

  • executionStats.totalDocsExamined:检查扫描的文档数量是否显著减少。

  • executionStats.executionTimeMillis:检查查询执行时间是否减少。

3.索引优化建议

  • 索引顺序:复合索引的顺序非常重要。如果查询条件中 field1是等值查询,而 field2是范围查询,那么将 field11放在前面会更高效。

  • 索引选择性:选择性高的字段(即唯一值多的字段)放在索引前面。例如,如果 field1的唯一值比 field2多,则将 field1放在前面。

  • 覆盖索引:如果查询只需要返回索引字段,可以创建一个覆盖索引,避免回表查询。例如:

    db.mytable.createIndex({ ‌field1: 1, ‌field2: 1, other_field: 1 })

 4.其他优化建议

  • 数据分布:检查 field1和 field2的数据分布。如果某个字段的值非常集中(如 field2总是相同),索引的效果可能不明显。

  • 查询模式:如果查询模式固定(如总是查询 field1和 field2),复合索引是最佳选择。如果查询模式多变,可能需要创建多个索引。

  • 索引大小:索引会占用存储空间,并影响写入性能。确保索引的收益大于其成本。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36659.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV图像拼接(1)概述

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 此图说明了在Stitcher类中实现的拼接模块流程。使用该类,可以配置/移除某些步骤,即根据特定需求调整拼接流程。流程中的所…

【开原宝藏】30天学会CSS - DAY1 第一课

下面提供一个由浅入深、按步骤拆解的示例教程,让你能从零开始,逐步理解并实现带有旋转及悬停动画的社交图标效果。为了更简单明了,以下示例仅创建四个图标(Facebook、Twitter、Google、LinkedIn),并在每一步…

【pytest框架源码分析五】pytest插件的注册流程

前文介绍到pytest整体是运用插件来实现其运行流程的。这里仔细介绍下具体过程。 首先进入main方法 def main(args: list[str] | os.PathLike[str] | None None,plugins: Sequence[str | _PluggyPlugin] | None None, ) -> int | ExitCode:"""Perform an i…

谷歌or-tools开源库入门

1.命令行编译程序 这里要说明下,直接用qt或者VS2022打开cmake工程,编译没有成功。所以,老老实实的按照官方教程来,使用命令行编译。 (1)准备 1)安装cmake,版本3.18以上&#xff0…

Python实现WYY音乐下载

一、需求背景 WYY音乐作为国内主流音乐平台,其歌曲资源丰富但下载接口存在多重加密保护。本文将通过Python结合JS逆向技术,解析其核心加密逻辑,实现免费歌曲的下载功能。 二、技术难点分析 1. 接口加密机制 通过抓包分析可知,网易云核心接口使用两次加密: 第一次:获取…

拥抱健康生活,开启养生之旅

在快节奏的现代生活中,健康养生愈发重要,它不仅能让我们保持良好状态,更是享受美好生活的基石。​ 饮食养生是健康的关键。我们应秉持均衡原则,一日三餐合理搭配。多摄入新鲜蔬果,它们富含维生素、矿物质与膳食纤维&a…

《Waf 火绒终端防护绕过实战:系统程序副本+Certutil木马下载技术详解》

目录 绕过火绒终端安全软件的详细方法 方法一:利用系统程序副本绕过命令监控 方法二:结合certutil.exe副本下载并执行上线木马 注意事项 总结 实际案例解决方案 前提条件 详细操作步骤 1. 攻击主机(VPS)上的准备工作 2.…

机器学习概要

文章目录 一、什么是机器学习 二、机器学习的种类 1. 有监督学习 2. 无监督学习 3.强化学习 三、机器学习的应用 四、机器学习的步骤 1. 数据的重要性 2. 数据和学习的种类 3. 可视化 一、什么是机器学习 机器学习指的是计算机根据给定的问题、课题或环境进行学习&a…

C# Winform 实现换肤,并自定义皮肤功能

具体实现原理详见 SkinHelp.cs类,实现了对原有控件的重绘,详见源码 public abstract class SkinHelp{private static SkinColor _currentSkinColor SkinColor.Default;private static BackgroundStripe _currentStripe BackgroundStripe.Default;priva…

基于FPGA的3U机箱模拟量高速采样板ADI板卡,应用于轨道交通/电力储能等

板卡简介: 本板为模拟量高速采样板(ADI),主要用于电机转速和相电流检测,以实现电机闭环控制。 性能规格: 电源:DC5V,DC3.3V,DC15V,DC24V FPGA:…

python爬虫概述

0x00 python爬虫概述 以豆瓣的选电影模块为例,当查看源代码搜索猫猫的奇幻漂流瓶是搜不到的 这时服务器的工作方式应该是这样的 客户端浏览器第一次访问其实服务器端是返回的一个框架(html代码) 当客户端浏览器第二次通过脚本等方式进行访问时服务器端才返回的数据…

win10 如何用我的笔记本 接网线 远程控制 台式机

1.查看笔记本ip,台式机ip。确保在同一网段 可以ping通 1.1 ip在同一网段,但是ping不通 1.解决:把双方防火墙关闭 2.解决:当前网口,先禁用再启用 以上两台电脑就可以ping通了 2.设置双方电脑 启动远程控制 此电脑-》…

给管理商场消防安全搭建消防安全培训小程序全过程

一、需求沟通 “我是管理商场消防安全的嘛,做这个的作用呢,1是商场的所有商户员工可以看平面或者视频随时自学, 2是我们定期培训必修课程、考试,这个需要留存他们的手签字的签到表确认我们讲给他们听了(免责很重要&am…

可视化图解算法:链表中倒数(最后)k个结点

1. 题目 描述 输入一个长度为 n 的链表,设链表中的元素的值为ai ,返回该链表中倒数第k个节点。 如果该链表长度小于k,请返回一个长度为 0 的链表。 数据范围:0≤n≤105,0 ≤ai≤109,0 ≤k≤109 要求&am…

Quartz知识点总结

简单说明 简单的定时任务使用Timer或者ScheduledExecutorService quartz支持复杂的定时执行功能。支持ram存储(内存存储)和持久化存储。quartz有分布式和集群能力 简单使用 获取任务调度器Schedule。任务调度器可以管理任务。创建任务实例。使用JobB…

C语言每日一练——day_12(最后一天)

引言 针对初学者,每日练习几个题,快速上手C语言。第十二天。(最后一天,完结散花啦) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ&#xff0…

【宇宙回响】从Canvas到MySQL:飞机大战的全栈交响曲【附演示视频与源码】

🌟 这是星际大战系列的第三篇送福利文章,感谢一路以来支持和关注这个项目的每一位朋友! 💡 文章力求严谨,但难免有疏漏之处,欢迎各位朋友指出,让我们一起在交流中进步。 🎁 项目代码…

数据结构知识点1

目录 一、时间复杂度和空间复杂度 1.1时间复杂度: 1.2空间复杂度: 二、装箱和拆箱 三、泛型 3.1泛型类的使用: 3.2泛型的上界: 3.3泛型方法: 一、时间复杂度和空间复杂度 1.1时间复杂度: 时间复杂…

华为ipd流程华为流程体系管理华为数字化转型流程数字化管理解决方案介绍81页精品PPT

华为流程体系最佳实践主要包括构建完善的流程框架,明确各层级流程要素与职责,梳理涵盖研发、采购、营销、服务、资产管理等多领域的流程,通过梳理业务场景和核心能力搭建差异化流程框架,采用自上而下与自下而上相结合的建模方法&a…

在大数据开发中ETL是指什么?

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字经济时代,数据已成为企业最核心的资产。然而,分散在业务系统、日志文件…