引入

与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,慢日志的更多相关文章

  1. 利用log4j+mongodb实现分布式系统中日志统一管理

    背景     在分布式系统当中,我们有各种各样的WebService,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出.为了方便对这些日志进行统一管理和分析.我们可以将日志统一输出到指定的数 ...

  2. MongoDB中4种日志的详细介绍

    前言 任何一种数据库都有各种各样的日志,MongoDB也不例外.MongoDB中有4种日志,分别是系统日志.Journal日志.oplog主从日志.慢查询日志等.这些日志记录着MongoDB数据库不同 ...

  3. [转载]MongoDB查询优化原则

    .在查询条件.排序条件.统计条件的字段上选择创建索引,可以显著提高查询效率. .用$or时把匹配最 多 结果的条件放在最前面,用$and时把匹配最 少 结果的条件放在最前面. .使用limit()限定 ...

  4. MongoDB 查询优化分析

    摘要: 在MySQL中,慢查询日志是经常作为我们优化查询的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是开启Profiling功能.该工具在运行的实例上收集有关MongoDB的写操 ...

  5. 详解log4j2(下) - Async/MongoDB/Flume Appender 按日志级别区分文件输出

    1. 按日志级别区分文件输出 有些人习惯按日志信息级别输出到不同名称的文件中,如info.log,error.log,warn.log等,在log4j2中可通过配置Filters来实现. 假定需求是把 ...

  6. MySQL慢查询优化 EXPLAIN详解

            我们平台过一段时间就会把生产数据库的慢查询导出来分析,要嘛修改写法,要嘛新增索引.以下是一些笔记.总结整理 慢查询排查         show status;  // 查询mysql ...

  7. MongoDB 索引 explain 分析查询速度

    一.索引基础索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更快.MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧.下面是创建索引 ...

  8. MongoDB查询优化

    项目场景:Mongo在首次查询特慢,后面就好的.如果长时间不查询,下次开始的第一次又将非常慢,于是从链接当时多方面,排查最终发现还是mongo索引建的有问题. MongoDB在大批量数据查询时经常会遇 ...

  9. Mongodb 查询优化(慢查询Profiling)

    开启慢查询Profiling Profiling级别说明 0:关闭,不收集任何数据. 1:收集慢查询数据,默认是100毫秒. 2:收集所有数据 1.通过修改配置文件开启Profiling 修改启动mo ...

随机推荐

  1. git远程仓库Github

    一.克隆项目 git clone 网址 1.配置信息 git config user.name '用户名' git config user.email '邮箱号' 2.推送项目到远程仓库 # 工作区代 ...

  2. Windows安装Pytorch并配置Anaconda与Pycharm

    1 开发环境准备 Python 3.7+Anaconda3 5.3.1(64位)+CUDA+Pycharm Community 2 安装Anaconda 2.1 进入官网下载: 根据windows版本 ...

  3. CTF练习三 —— 命令注入&命令执行绕过

    这个题是第四届强网杯也就是2020.8.22号开始的那场一道简单的命令注入题,再这之前我并没有学习过命令注之类的知识,,,看到题之后先搜在学,,误打误撞解了出来,过段时间wp就会放出来,所以这里就不对 ...

  4. C#中的深度学习(三):理解神经网络结构

    在这篇文章中,我们将回顾监督机器学习的基础知识,以及训练和验证阶段包括哪些内容. 在这里,我们将为不了解AI的读者介绍机器学习(ML)的基础知识,并且我们将描述在监督机器学习模型中的训练和验证步骤. ...

  5. MySQL优化索引

    1.  MySQL如何使用索引 索引用于快速查找具有特定列值的行.如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行.表越大,花费越多.如果表中有相关列的索引,MySQL可以快速确 ...

  6. 记录第一次使用Vivado——以全加器为例子

    从altera转战xilinx,经典的FPGA到ZYNQ系列,第一站就是先熟悉编译软件Vivado.我就直接跳过软件安装部分了,如有疑问,可以在评论区提出来,我看到了就帮你解答. 首先是是打开界面 然 ...

  7. Kotlin 简单使用手册

    在昨天和做android的前辈一番交谈后,觉得很惭愧,许多东西还只是知其然而不知其所以然,也深感自己的技术还太浅薄.以后要更加努力地学习,要着重学习原理.方法论,不能只停留在会用的阶段. 今天又要献丑 ...

  8. [leetcode]TwoSum系列问题

    1.普通数组找两个数,哈希表建立数值和下标的映射,遍历时一边判断一边添加 /* 哇,LeetCode的第一题...啧啧 */ public int [] twoSum(int[] nums, int ...

  9. Android硬件访问服务中的HAL-查看打印的信息

    JNI  向上提供本地函数,向下加载HAL文件并调用HAL的函数 HAL 负责访问驱动程序执行硬件操作. external\chromium_org\third_party\hwcplus\src\h ...

  10. Kubernetes项目简介

    Kubernetes项目简介 Kubernetes 是 Google 团队发起的开源项目,它的目标是管理跨多个主机的容器,提供基本的部署,维护以及运用伸缩,主要实现语言为 Go 语言.Kubernet ...