MongoDB查询优化--explain,慢日志
引入
与Mysql数据库一样,MongoDB也有自己的查询优化工具,explain和慢日志
explain
shell命令格式
db.collection.explain().<method(...)>
支持的method方法有:
aggregate()
count()
find()
remove()
update()
distinct()
findAndModify()
例如:
db.products.explain().remove( { category: "apparel" }, { justOne: true } )
db.collection.explain()接收的参数有:"queryPlanner" (Default)、"executionStats"、"allPlansExecution"。
queryPlanner模式:查询计划模式,返回查询计划信息
executionStats模式:执行状态模式,返回查询计划信息、执行状态信息
allPlansExecution模式:返回queryPlanner和executionStats两种模式的信息和
通常executionStats模式比较常用,举例说明一下返回信息具体含义
> db.tb_uhome_house.find({"community_id":5098, "status":1,"submit":0,"resources_type":0}).explain("executionStats")
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "uhome.tb_uhome_house",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [
{
"community_id" : {
"$eq" : 5098
}
},
{
"resources_type" : {
"$eq" : 0
}
},
{
"status" : {
"$eq" : 1
}
},
{
"submit" : {
"$eq" : 0
}
}
]
},
"winningPlan" : {
"stage" : "FETCH",
"filter" : {
"$and" : [
{
"resources_type" : {
"$eq" : 0
}
},
{
"status" : {
"$eq" : 1
}
},
{
"submit" : {
"$eq" : 0
}
}
]
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"community_id" : 1
},
"indexName" : "community_id_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"community_id" : [
"[5098.0, 5098.0]"
]
}
}
},
"rejectedPlans" : [
{
"stage" : "FETCH",
"filter" : {
"$and" : [
{
"resources_type" : {
"$eq" : 0
}
},
{
"status" : {
"$eq" : 1
}
},
{
"submit" : {
"$eq" : 0
}
}
]
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"community_id" : 1,
"room_no" : 1
},
"indexName" : "community_id_1_room_no_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"community_id" : [
"[5098.0, 5098.0]"
],
"room_no" : [
"[MinKey, MaxKey]"
]
}
}
}
]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 74345,
"executionTimeMillis" : 880,
"totalKeysExamined" : 74346,
"totalDocsExamined" : 74346,
"executionStages" : {
"stage" : "FETCH",
"filter" : {
"$and" : [
{
"resources_type" : {
"$eq" : 0
}
},
{
"status" : {
"$eq" : 1
}
},
{
"submit" : {
"$eq" : 0
}
}
]
},
"nReturned" : 74345,
"executionTimeMillisEstimate" : 851,
"works" : 74347,
"advanced" : 74345,
"needTime" : 1,
"needYield" : 0,
"saveState" : 587,
"restoreState" : 587,
"isEOF" : 1,
"invalidates" : 0,
"docsExamined" : 74346,
"alreadyHasObj" : 0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 74346,
"executionTimeMillisEstimate" : 91,
"works" : 74347,
"advanced" : 74346,
"needTime" : 0,
"needYield" : 0,
"saveState" : 587,
"restoreState" : 587,
"isEOF" : 1,
"invalidates" : 0,
"keyPattern" : {
"community_id" : 1
},
"indexName" : "community_id_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"community_id" : [
"[5098.0, 5098.0]"
]
},
"keysExamined" : 74346,
"seeks" : 1,
"dupsTested" : 0,
"dupsDropped" : 0,
"seenInvalidated" : 0
}
}
},
"serverInfo" : {
"host" : "bnode",
"port" : 27018,
"version" : "3.4.4",
"gitVersion" : "888390515874a9debd1b6c5d36559ca86b44babd"
},
"ok" : 1
}
explain.queryPlanner中的信息:
explain.queryPlanner.winningPlan 描述被查询优化器选择的查询计划信息,其中inputstage描述选择的索引信息
explain.queryPlanner.rejectedPlan 描述被查询优化器拒绝的查询计划信息
explain.executionStats中的信息:
explain.executionStats.nReturned 返回的文档数
explain.executionStats.executionTimeMillis 执行查询的耗时(ms)
explain.executionStats.totalKeysExamined 被扫描索引的数量
explain.executionStats.totalDocsExamined 被扫描文档的数量
慢日志
查看优化日志级别:
db.getProfilingLevel()
db.getProfilingStatus()
打开优化日志:
db.setProfilingLevel(1,200) //慢日志打印耗时超过200ms的查询
查看慢日志:
db.system.profile.find()查看慢查询,可以通过条件过滤想要信息。关键字段:
op:操作类型
ns:被查的集合
commond:命令的内容
docsExamined:扫描文档数
nreturned:返回记录数
millis:耗时时间,单位毫秒
ts:命令执行时间
responseLength:返回内容长度
主要查看查询时间和返回数据长度,如果返回数据量过大,也会影响总体的查询时间。
数据量越大网络传输和客户端解析反序列化的耗时越多,所以客户端查询的时候,尽量通过projection指定返回字段信息
参考:
https://docs.mongodb.com/manual/reference/method/db.collection.explain/index.html
https://docs.mongodb.com/manual/reference/explain-results/#queryplanner
MongoDB查询优化--explain,慢日志的更多相关文章
- 利用log4j+mongodb实现分布式系统中日志统一管理
背景 在分布式系统当中,我们有各种各样的WebService,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出.为了方便对这些日志进行统一管理和分析.我们可以将日志统一输出到指定的数 ...
- MongoDB中4种日志的详细介绍
前言 任何一种数据库都有各种各样的日志,MongoDB也不例外.MongoDB中有4种日志,分别是系统日志.Journal日志.oplog主从日志.慢查询日志等.这些日志记录着MongoDB数据库不同 ...
- [转载]MongoDB查询优化原则
.在查询条件.排序条件.统计条件的字段上选择创建索引,可以显著提高查询效率. .用$or时把匹配最 多 结果的条件放在最前面,用$and时把匹配最 少 结果的条件放在最前面. .使用limit()限定 ...
- MongoDB 查询优化分析
摘要: 在MySQL中,慢查询日志是经常作为我们优化查询的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是开启Profiling功能.该工具在运行的实例上收集有关MongoDB的写操 ...
- 详解log4j2(下) - Async/MongoDB/Flume Appender 按日志级别区分文件输出
1. 按日志级别区分文件输出 有些人习惯按日志信息级别输出到不同名称的文件中,如info.log,error.log,warn.log等,在log4j2中可通过配置Filters来实现. 假定需求是把 ...
- MySQL慢查询优化 EXPLAIN详解
我们平台过一段时间就会把生产数据库的慢查询导出来分析,要嘛修改写法,要嘛新增索引.以下是一些笔记.总结整理 慢查询排查 show status; // 查询mysql ...
- MongoDB 索引 explain 分析查询速度
一.索引基础索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更快.MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧.下面是创建索引 ...
- MongoDB查询优化
项目场景:Mongo在首次查询特慢,后面就好的.如果长时间不查询,下次开始的第一次又将非常慢,于是从链接当时多方面,排查最终发现还是mongo索引建的有问题. MongoDB在大批量数据查询时经常会遇 ...
- Mongodb 查询优化(慢查询Profiling)
开启慢查询Profiling Profiling级别说明 0:关闭,不收集任何数据. 1:收集慢查询数据,默认是100毫秒. 2:收集所有数据 1.通过修改配置文件开启Profiling 修改启动mo ...
随机推荐
- IDEA创建maven项目很慢的问题解决方式
问题现象:刚转IDEA开发,发现创建maven项目,非常慢. 解决方式: 构建maven项目添加参数,要不然非常慢,会卡住-DarchetypeCatalog=internal 自动导入包,codin ...
- js下 Day02、DOM文档对象模型
一.DOM简介 Document Object Model 文档对象模型 DOM包含了所有HTML元素的属性和方法,以及访问他们的方式: #二.DOM节点 #1. 什么是节点? HTML中所有的元素都 ...
- Google、Facebook等均开始支持的HTTP3到底是个什么鬼?
GitHub 19k Star 的Java工程师成神之路,不来了解一下吗! 最近一段时间以来,关于HTTP/3的新闻有很多,越来越多的国际大公司已经开始使用HTTP/3了. 所以,HTTP/3已经是箭 ...
- P4735 最大异或和 01 Trie
题目描述 给定一个非负整数序列 \(\{a\}\),初始长度为\(n\). 有 \(m\) 个操作,有以下两种操作类型: \(A\ x\):添加操作,表示在序列末尾添加一个数 \(x\),序列的长度 ...
- Python爬取房天下二手房信息
一.相关知识 BeautifulSoup4使用 python将信息写入csv import csv with open("11.csv","w") as csv ...
- 【代码周边】npm是What?
社区 程序员自古以来就有社区文化: 社区的意思是:拥有共同职业或兴趣的人们,自发组织在一起,通过分享信息和资源进行合作.虚拟社区的参与者经常会在线讨论相关话题,或访问某些网站.前端程序员也有社区,世界 ...
- SQL数据库创建,创建表,增删改查
创建数据库:create datebase数据库名 删除数据库:drop datebase 数据库名称 创建表格式: create table 表名(字段名1,字段类型1,字段名2,字段类型2) 查询 ...
- java零基础之---eclipse的使用
想写一篇关于初学者如何使用工具的博客,作为初学者使用IDE的第一个工具,深受大家喜欢,先写一篇eclipse的,然后再逐步推出idea, vscode 等 1. eclipse的下载及安装 1)百度搜 ...
- 关于char是否能表示一个中文
char是可以表示中文的 这个问题点有3个考核点 1 char是多少位的 2 java用的是什么方式表示字符 3 Unicode是用多少位表示的 1的答案是16位的,2的答案是Unicode,3的答案 ...
- FFT原理及C++与MATLAB混合编程详细介绍
一:FFT原理 1.1 DFT计算 在一个周期内的离散傅里叶级数(DFS)变换定义为离散傅里叶变换(DFT). \[\begin{cases} X(k) = \sum_{n=0}^{N-1}x(n)W ...