mongodb应用心得

ops/2024/12/23 6:05:36/

mongodb_0">基于springboot做mysql业务基础数据分析到mongodb文档库

索引分析

查看当前集合索引:db.collection.getIndexes()
explain 方法查看是如何执行的:db.users.find({ name: “John” }).sort({ age: -1 }).explain(“executionStats”)
参数指标:
queryPlanner:显示查询优化器的选择。
serverInfo:提供服务器信息。
executionStats:提供详细的执行统计信息。
关键字段:
winningPlan:显示实际使用的查询计划。
rejectedPlans:显示被拒绝的查询计划。
nReturned:返回的文档数量。
executionTimeMillis:查询执行时间(毫秒)。
totalKeysExamined:扫描的索引键数量。
totalDocsExamined:扫描的文档数量。
nYields:查询过程中让步的次数。
stage:查询执行的不同阶段。

{"queryPlanner": {"plannerVersion": 1,"namespace": "mydatabase.users","indexFilterSet": false,"parsedQuery": {"name": {"$eq": "John"}},"winningPlan": {"stage": "FETCH","inputStage": {"stage": "IXSCAN","keyPattern": {"name": 1,"age": -1},"indexName": "idx_name_age","isMultiKey": false,"multiKeyPaths": {"name": [],"age": []},"isUnique": false,"isSparse": false,"isPartial": false,"indexVersion": 2,"direction": "forward","indexBounds": {"name": ["[\"John\", \"John\"]"],"age": ["[MaxKey, MinKey]"]}}},"rejectedPlans": []},"executionStats": {"executionSuccess": true,"nReturned": 10,"executionTimeMillis": 1,"totalKeysExamined": 10,"totalDocsExamined": 10,"executionStages": {"stage": "FETCH","nReturned": 10,"executionTimeMillisEstimate": 0,"works": 11,"advanced": 10,"needTime": 0,"needYield": 0,"saveState": 0,"restoreState": 0,"isEOF": 1,"invalidates": 0,"docsExamined": 10,"alreadyHasObj": 0,"inputStage": {"stage": "IXSCAN","nReturned": 10,"executionTimeMillisEstimate": 0,"works": 11,"advanced": 10,"needTime": 0,"needYield": 0,"saveState": 0,"restoreState": 0,"isEOF": 1,"invalidates": 0,"keyPattern": {"name": 1,"age": -1},"indexName": "idx_name_age","isMultiKey": false,"multiKeyPaths": {"name": [],"age": []},"isUnique": false,"isSparse": false,"isPartial": false,"indexVersion": 2,"direction": "forward","indexBounds": {"name": ["[\"John\", \"John\"]"],"age": ["[MaxKey, MinKey]"]},"keysExamined": 10,"dupsTested": 0,"dupsDropped": 0,"seenInvalidated": 0}}},"serverInfo": {"host": "localhost","port": 27017,"version": "4.4.6","gitVersion": "72e66213c2c3eab37d9358d5e78ad7f5c1d0d0d7"},"ok": 1
}关键分析:
winningPlan.stage: FETCH 表示查询从索引中获取文档。
winningPlan.inputStage.stage: IXSCAN 表示使用了索引扫描。
winningPlan.inputStage.indexName: idx_name_age 表示使用的索引名称。
executionStats.totalKeysExamined: 10 表示扫描了10个索引键。
executionStats.totalDocsExamined: 10 表示扫描了10个文档。
executionStats.executionTimeMillis: 1 表示查询执行时间为1毫秒。
indexStats 命令:indexStats 命令可以提供关于索引使用情况的统计信息,帮助你识别哪些索引被频繁使用,哪些索引几乎未被使用db.users.aggregate([{ $indexStats: {} }])[{"name": "_id_","key": {"_id": 1},"host": "localhost:27017","accesses": {"ops": 1000,"since": ISODate("2023-10-01T00:00:00Z")}},{"name": "idx_name_age","key": {"name": 1,"age": -1},"host": "localhost:27017","accesses": {"ops": 500,"since": ISODate("2023-10-01T00:00:00Z")}}
]
关键分析:
name: 索引名称。
key: 索引的键模式。
accesses.ops: 自上次重启以来对该索引的访问次数。
accesses.since: 上次重启的时间。
db.collection.stats()stats 方法提供集合的统计信息,包括索引的大小和使用情况。
{"ns": "mydatabase.users","size": 1048576,"count": 1000,"avgObjSize": 1048,"storageSize": 2097152,"capped": false,"nindexes": 2,"indexSizes": {"_id_": 26112,"idx_name_age": 26112},"totalIndexSize": 52224,"indexBuilds": {},"ok": 1
}
关键点分析
size: 集合的总大小。
count: 文档数量。
avgObjSize: 平均文档大小。
storageSize: 存储大小。
nindexes: 索引数量。
indexSizes: 每个索引的大小。
totalIndexSize: 所有索引的总大小。

mongodb分析步奏
分析步骤:

  1. 查看现有索引: db.collection.getIndexes() 使用 explain 方法:
  2. db.collection.find({ query }).explain(“executionStats”) 使用
  3. indexStats 命令: db.collection.aggregate([{ $indexStats: {} }])
  4. 使用 db.currentOp() 监控当前操作: db.currentOp() 使用 mongostat 和
  5. mongotop 监控工具: mongostat、mongotop 使用 db.collection.validate()
  6. 验证集合完整性: db.collection.validate() 使用 db.collection.stats()
  7. 获取集合统计信息: db.collection.stats() 使用 db.collection.dataSize()
  8. 获取数据大小: db.collection.dataSize() 使用
  9. db.collection.totalIndexSize()
    10.获取索引总大小: db.collection.totalIndexSize()
重建索引

重建集合中所有索引
db.集合名.reIndex()
删除指定索引:db.users.dropIndex(“indexName”)
重建指定索引:db.users.dropIndex(“idx_name”)

创建索引

1表示升序,-1表示降序
单字段索引
db.users.createIndex({ name: 1 })
复合索引
db.users.createIndex({ name: 1, age: -1 })


http://www.ppmy.cn/ops/144237.html

相关文章

从零开始学TiDB(6)深入学习Placement Driver(PD)

一.PD整体架构 PD的功能: 元数据的存储(解决执行计划如何得知去哪个region中获取数据)全局时钟:查询开始时间,事务开始,结束的时间。分配全局ID和事务ID对region进行调度(热点region的调度处理&…

【力扣算法】203.移除链表元素

在对链表进行操作的时候,可以考虑添加虚拟头结点 1. 虚拟头结点 设置虚拟头结点,让头结点的next指向head class Solution{public ListNode removeElements(ListNode head,int val){ListNode pre new ListNode();pre.next head;ListNode index pre;w…

使用Python实现量子密钥分发:构建安全通信的未来

量子密钥分发(Quantum Key Distribution, QKD)是一种利用量子力学原理进行密钥分发的方法,能够实现无条件安全的密钥传输。QKD是量子通信中的重要应用,通过量子比特(qubits)的传输和测量,实现安…

【LeetCode】9、回文数

【LeetCode】9、回文数 文章目录 一、数学: 除法和取模1.1 数学: 除法和取模 二、多语言解法 一、数学: 除法和取模 1.1 数学: 除法和取模 例如 15251, offset 也是五位数的 10000 先判断首1和尾1, 再变为 525, offset 变为 100 再判断首5和尾5, 再变为 2, offset 变为 1 整个…

linux系统编程(五)

1、信号 信号是事件发生时对进程的通知机制,针对每个信号都定义了一个唯一的整数,这些整数定义在signal.h中。 常见信号如下: SIGABRT:进程调用abort函数,系统向进程发送此信号,终止进程并产生核心转储文…

Telegram bot Mini-App开发实践---Telegram简单介绍与初始化小程序获取window.Telegram.WebApp对象并解析

➡️【好看的灵魂千篇一律,有趣的鲲志一百六七!】- 欢迎认识我~~ 作者:鲲志说 (公众号、B站同名,视频号:鲲志说996) 科技博主:极星会 星辉大使 后端研发:java、go、python、TS,前电商、现web3 主理人:COC杭州开发者社区主理人 、周周黑客松杭州主理人、 AI爱好…

Hive其五,使用技巧,数据查询,日志以及复杂类型的使用

目录 一、关于Hive使用的一些技巧 二、表的数据查询 三、Hive默认的日志 四、复杂数据类型 1、Array的使用 2、展开函数的使用 explode 3、Map的使用 4、Struct结构体 一、关于Hive使用的一些技巧 1、可以直接不进入hive的情况下执行sql语句 通过shell的参数 -e 可以执…

图片和媒体资源的优化:提升Web应用性能与用户体验的关键

文章目录 前言一、为什么需要优化图片和媒体资源二、图片优化策略三、媒体资源优化策略四、案例研究:实际效果展示结语 前言 在现代Web开发中,图片和媒体资源(如音频、视频)的质量和加载速度对用户体验有着直接影响。高质量的媒体…