MongoDB调优-查询优化-MongoDB Profiler
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: <string> # 默认为 off,可选值 off、slowOp(对应上面的等级 1)、all(对应上面的等级 2)
slowOpThresholdMs: <int> # 阈值,默认值为100,单位毫秒
slowOpSampleRate: <double> # 随机采集慢查询的百分比值,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" # 经过验证的用户
}
MongoDB调优-查询优化-MongoDB Profiler的更多相关文章
- MongoDB部署、使用、监控及调优
MongoDB部署 系统环境:CentOS7 下载地址:http://mirrors.163.com/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD ...
- Mongodb性能调优
摘要 1. Mongodb 适用场景简介 2. Mongodb 性能监控与分析 3. Mongodb 性能优化建议 关于Mongodb的几个大事件 1.根据美国数据库知识大全官网发布的DB热度排行,M ...
- SQL Server调优系列进阶篇(查询优化器的运行方式)
前言 前面我们的几篇文章介绍了一系列关于运算符的基础介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符. ...
- .NET性能调优之一:ANTS Performance Profiler的使用
.NET性能调优系列文章 系列文章索引 .NET性能调优之一:ANTS Performance Profiler的使用 .NET性能调优之二:使用Visual Studio进行代码度量 .NET性能调 ...
- 浅尝key-value数据库(二)——MongoDB的优与劣
浅尝key-value数据库(二)——MongoDB的优与劣 MongoDB的名字取自英文单词"humongous"的中间五个字母,是一个C++开发的基于分布式文件存储的数据库开源 ...
- IOS性能调优系列:使用Time Profiler发现性能瓶颈
硬广:<IOS性能调优系列>第五篇,预计会有二十多篇,持续更新,欢迎关注. 之前四篇都是关注于内存方面,分析了内存泄漏.僵尸对象.内存分配,本篇介绍Time Profiler工具的使用,开 ...
- MySQL慢查询优化(线上案例调优)
文章说明 这篇文章主要是记录自己最近在真实工作中遇到的慢查询的案例,然后进行调优分析的过程,欢迎大家一起讨论调优经验.(以下出现的表名,列名都是化名,实际数据也进行过一点微调.) PS:最近做了一个面 ...
- PHP 性能分析第三篇: 性能调优实战
注意:本文是我们的 PHP 性能分析系列的第三篇,点此阅读 PHP 性能分析第一篇: XHProf & XHGui 介绍 ,或 PHP 性能分析第二篇: 深入研究 XHGui. 在本系列的 ...
- MySQL面试必考知识点:揭秘亿级高并发数据库调优与最佳实践法则
做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离... 数据库的使用,是开发人员的基本功,对它掌握越清晰越深入,你能做的事情就越多. 今天我们用10分钟 ...
随机推荐
- php一些简单的作业题
- leveldb 学习记录(二) Slice
基本每个KV库都有一个简洁的字符串管理类 比如redis的sds 比如leveldb的slice 管理一个字符串指针和数据长度 通过对字符串指针 长度的管理实现一般的创建 判断是否为空 获取第N个位 ...
- python参数
1.形参变量和实参 形参变量:只有在被调用时才分配内存单元,在调用结束时,即释放所分配的内存单元,因此,形参只在函数内有效,函数调用结束返回主调用函数后则不能再使用该形参变量. 实参:可以是常量,变量 ...
- for循环的实例
1.大马驮2石粮食,中马驮1石粮食,两头小马驮一石粮食,要用100匹马,驮100石粮食,该如//首先我们要知道一百石粮食需要这些马分别几匹 //第一个是大马,需要五十匹马for(var x=0;x&l ...
- javascript 错误监控
一.错误分类 1,即使运行错误:代码错误, 2.资源加载错误 二. 错误的捕获方式 1.即使运行错误的捕获方式 a. try catch b.window.onerror 2.资源加载错误 ...
- centos7安装python3.6后导致防火墙功能无法正常工作的解决办法
问题:因为默认python版本被设置成了python3.6,而进行防火墙的指令操作频频报错. Jul 19 16:30:51 localhost.localdomain systemd[1]: Sta ...
- Log system architecture
0. 技术选型参考 1. Collector Keywords: Collector, Processor 名称 Beats Fluentd-bit Introduction Beats are a ...
- ubuntu16.04安装maven
一.下载maven apache maven官网地址:http://maven.apache.org/download.cgi 找到Link列下的“apache-maven-3.5.2-bin.tar ...
- .NET Core微服务之路:让我们对上一个Demo通讯进行修改,完成RPC通讯
最近一段时间有些事情耽搁了更新,抱歉各位了. 上一篇我们简单的介绍了DotNetty通信框架,并简单的介绍了基于DotNetty实现了回路(Echo)通信过程. 我们来回忆一下上一个项目的整个流程: ...
- 设计模式总结(Java)—— 单例模式
1. 定义 为了确保一个类有且仅有一个实例,而且自行实例化并向整个系统提供这个实例. 2. 使用场景 确保某个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有 ...