MongoDB调优-查询优化-MongoDB Profiler

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: MongoDB调优-查询优化-MongoDB ProfilerMongoDB Profiler 概述官方文档:https://docs.mongodb.com/manual/tutorial/manage-the-database-profiler/index.html熟悉 Mysql 的人应该知道,Mysql 是有个慢查询日志的,它可以帮助我们进行优化我们的 sql,并提高我们系统的稳定性和流畅性。

MongoDB调优-查询优化-MongoDB Profiler
MongoDB Profiler 概述
官方文档:https://docs.mongodb.com/manual/tutorial/manage-the-database-profiler/index.html

熟悉 Mysql 的人应该知道,Mysql 是有个慢查询日志的,它可以帮助我们进行优化我们的 sql,并提高我们系统的稳定性和流畅性。那么 MongoDB 中是否也有类似的功能吗? 是有的,它就是 Database Profiler(下面我直接称为慢查询了),我们可以通过设置 Database Profiler 来记录一些超过阈值的查询。然后我们后期可以通过这些记录进行优化查询。

MongoDB 的 慢查询记录储存在 system.profile 里,默认情况下是关闭的,我们可以在数据库级别上或者是节点级别上配置。

状态码 描述
0 关闭慢查询,默认情况下
1 超过阈值的查询收集
2 为所有数据库开启慢查询记录,收集所有的数据
通过 MongoDB shell 启用

为所有数据库开启慢查询记录

db.setProfilingLevel(2)

指定数据库,并指定阈值慢查询 ,超过20毫秒的查询被记录

use test
db.setProfilingLevel(1, { slowms: 20 })

随机采集慢查询的百分比值,sampleRate 值默认为1,表示都采集,0.42 表示采集42%的内容。

db.setProfilingLevel(1, { sampleRate: 0.42 })

查询慢查询级别和其它信息

db.getProfilingStatus()

仅返回慢查询级别

db.getProfilingLevel()

禁用慢查询

db.setProfilingLevel(0)
通过配置文件启用
在ini 配置文件 mongodb.conf 添加以下参数, profile参数是设置开启等级,slowms是设置阈值

profile = 1
slowms = 300
在 YAML配置 文件配置

operationProfiling:
mode: # 默认为 off,可选值 off、slowOp(对应上面的等级 1)、all(对应上面的等级 2)
slowOpThresholdMs: # 阈值,默认值为100,单位毫秒
slowOpSampleRate: # 随机采集慢查询的百分比值,sampleRate 值默认为1,表示都采集,0.42 表示采集42%的内容
常用命令和示例

查询最近的10个慢查询日志

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

查询除命令类型为 ‘command’ 的日志

db.system.profile.find( { op: { $ne : 'command' } } ).pretty()

查询数据库为 mydb 集合为 test 的 日志

db.system.profile.find( { ns : 'mydb.test' } ).pretty()

查询 低于 5毫秒的日志

db.system.profile.find( { millis : { $gt : 5 } } ).pretty()

查询时间从 2012-12-09 3点整到 2012-12-09 3点40分之间的日志

db.system.profile.find({
ts : {

$gt: new ISODate("2012-12-09T03:00:00Z"),
$lt: new ISODate("2012-12-09T03:40:00Z")

}
}).pretty()
MongoDB慢日志解析
官方文档:https://docs.mongodb.com/manual/reference/database-profiler/index.html

{
"op" : "query", # 操作类型,值可为command、count、distinct、geoNear、getMore、group、insert、mapReduce、query、remove、update
"ns" : "test.report", # 操作的数据库和集合
"command" : { # 命令

  "find" : "report",  # 操作的集合
  "filter" : { "a" : { "$lte" : 500 } }, # 查询条件
  "lsid" : {    
     "id" : UUID("5ccd5b81-b023-41f3-8959-bf99ed696ce9") #用户的会话id
  },
  "$db" : "test"  # 操作的数据库

},
"cursorid" : 33629063128, # query和getmore 的游标id
"keysExamined" : 101, # MongoDB为执行操作而扫描的索引键的数量
"docsExamined" : 101, # MongoDB为了执行操作而扫描的集合中的文档数。
"numYield" : 2, # 让步次数,操作时让其他的操作完成的次数。
"nreturned" : 101, # 操作返回的文档数
"queryHash" : "811451DD", # 查询的hash值
"planCacheKey" : "759981BA",
"locks" : { # 操作期间的锁和所的类型

  "Global" : {  #表示全局锁定
     "acquireCount" : { #锁定的次数
        "r" : NumberLong(3)  # 表示共享锁 
     }
  },
  "Database" : {   # 数据库锁
     "acquireCount" : { "r" : NumberLong(1) },
     "acquireWaitCount" : { "r" : NumberLong(1) },
     "timeAcquiringMicros" : { "r" : NumberLong(69130694) }
  },
  "Collection" : {  # 集合锁
     "acquireCount" : { "r" : NumberLong(1) }
  }

},
"storage" : { # 储存

  "data" : {
     "bytesRead" : NumberLong(14736), #操作 从磁盘放到缓存的数据的字节数
     "timeReadingMicros" : NumberLong(17) # 操作 花费在磁盘读取的时间,以微妙为单位
  }

},
"responseLength" : 1305014, # 操作返回结果的文档长度,单位为字节
"protocol" : "op_msg", # 消息的协议
"millis" : 69132, # 从 MongoDB 操作开始到结束耗费的时间
"planSummary" : "IXSCAN { a: 1, _id: -1 }", # 摘要
"execStats" : { # 操作执行过程中的详细信息

  "stage" : "FETCH", # 操作形式 ,COLLSCAN 用于集合扫描,IXSCAN 用于扫描索引键,FETCH 用于检索文档
  "nReturned" : 101, # 返回的文档数量
  "executionTimeMillisEstimate" : 0,
  "works" : 101,
  "advanced" : 101,
  "needTime" : 0,
  "needYield" : 0,
  "saveState" : 3,
  "restoreState" : 2,
  "isEOF" : 0,
  "invalidates" : 0,
  "docsExamined" : 101,
  "alreadyHasObj" : 0,
  "inputStage" : {
     ...
  }

},
"ts" : ISODate("2019-01-14T16:57:33.450Z"), #操作的时间戳
"client" : "127.0.0.1", # 客户端的ip
"appName" : "MongoDB Shell", #客户端应用标识符
"allUsers" : [

  {
     "user" : "someuser", # 用户
     "db" : "admin"  # 验证的数据库
  }

],
"user" : "someuser@admin" # 经过验证的用户
}
作者:理想三旬
    
出处:https://www.cnblogs.com/operationhome/

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
NoSQL 索引
MongoDB查询优化:从 10s 到 10ms
本文是我前同事付秋雷最近遇到到一个关于MongoDB执行计划选择的问题,非常有意思,在探索源码之后,他将整个问题搞明白并整理分享出来。付秋雷(他的博客)曾是Tair(阿里内部用得非常官方的KV存储系统)的核心开发,目前就职于蘑菇街。
|
29天前
|
监控 NoSQL MongoDB
【MongoDB 专栏】MongoDB 查询优化技巧
【5月更文挑战第10天】本文探讨了MongoDB查询优化技巧,包括合理使用索引、优化查询语句、数据模型简化、避免全表扫描、选择合适查询方法及监控性能。通过案例分析展示了优化策略及其效果,强调了持续优化对提升数据库性能和用户体验的重要性。掌握这些技巧能有效挖掘MongoDB的潜力。
【MongoDB 专栏】MongoDB 查询优化技巧
|
29天前
|
NoSQL 大数据 数据处理
MongoDB聚合框架与复杂查询优化:技术深度解析
【4月更文挑战第30天】本文深入探讨了MongoDB的聚合框架和复杂查询优化技术。聚合框架包含$match、$group、$sort和$project阶段,用于数据处理和分析,提供灵活性和高性能。优化查询涉及创建合适索引、使用聚合框架、简化查询语句、限制返回结果数、避免跨分片查询、只查询所需字段及使用$inc操作符。理解这些技术有助于提升MongoDB在大数据和复杂查询场景下的性能。
|
27天前
|
存储 SQL NoSQL
什么是 MongoDB,为什么它是当今最受欢迎的数据库之一?
什么是 MongoDB,为什么它是当今最受欢迎的数据库之一?
|
29天前
|
JSON NoSQL MongoDB
理解Nosql数据库的mongodb
【5月更文挑战第5天】MongoDB是2009年发布的一款通用型NoSQL数据库,结合了关系模型和NoSQL的优点,适用于各种现代应用。其特点包括图形界面、数据服务、云基础设施集成(AWS, Azure, Google Cloud)。它具备全面的查询能力、ACID事务、可调整的一致性保证,并有多语言驱动及工具,可在任何地方运行。
206 4
|
29天前
|
存储 NoSQL MongoDB
MongoDB数据库转换为表格文件的Python实现
MongoDB数据库转换为表格文件的Python实现
153 0
|
29天前
|
存储 NoSQL 关系型数据库
Percona XtraBackup是否支持MongoDB数据库备份?
【5月更文挑战第13天】Percona XtraBackup是否支持MongoDB数据库备份?
126 1
|
1天前
|
存储 JSON NoSQL
【文档数据库】ES和MongoDB的对比
【文档数据库】ES和MongoDB的对比
6 1
|
6天前
|
NoSQL JavaScript 安全
精心操作MongoDB:删除数据库的关键步骤和重要事项
精心操作MongoDB:删除数据库的关键步骤和重要事项
|
6天前
|
NoSQL 测试技术 MongoDB
MongoDB数据库管理:全面掌握mongodump和mongorestore的备份与恢复技巧
MongoDB数据库管理:全面掌握mongodump和mongorestore的备份与恢复技巧