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 ...
随机推荐
- Kafka Connect使用入门-Mysql数据导入到ElasticSearch
1.Kafka Connect Connect是Kafka的一部分,它为在Kafka和外部存储系统之间移动数据提供了一种可靠且伸缩的方式,它为连接器插件提供了一组API和一个运行时-Connect负责 ...
- 属于同一网段的ip是不是就在同一个局域网?
参考文章链接: https://zhidao.baidu.com/question/350887200.html?qbl=relate_question_0&word=%D4%DA%D2%BB ...
- javaweb练手项目jsp+servlet简易购物车系统
简易购物车项目 这是一个用intellij IDEA做的简易的javaweb项目,开发环境使用的jdk1.8和tomcat8以及mysql数据库. 1.项目开发准备: 创建github仓库 项目框架搭 ...
- 用Python实现童年小游戏贪吃蛇
贪吃蛇作为一款经典小游戏,早在 1976 年就面世了,我最早接触它还是在家长的诺基亚手机中.
- matlab多项式拟合以及指定函数拟合
clc;clear all;close all;%% 多项式拟合指令:% X = [1 2 3 4 5 6 7 8 9 ];% Y = [9 7 6 3 -1 2 5 7 20]; % P= poly ...
- C# 递归算法获取下级子级 2种方法
第一种 直接实体添加Children 实体类 public class DepartmentItem { /// <summary> /// 部门Id /// </summary&g ...
- C#中打印拼接的字符串
实例化打印文档 //声明打印对象 PrintDocument pd = new PrintDocument(); int ilvPreviewIndex = 0; 在打印事件中设置基本属性 priva ...
- Kafka超详细学习笔记【概念理解,安装配置】
目录 本篇要点 Kafka介绍 作为流处理平台的三种特性 主要应用 四个核心API 基本术语 快速开始 安装配置Zookeeper 下载kafka 配置文件 Windows的命令 启动Zookeepe ...
- x264编码demo定制修改介绍
x264编码器,提供了两个demo来验证编码功能:一个是大而全的x264.c,另外一个是简洁版的example.c. 其中,前者demo,可以配置很多编码参数,但太冗长繁杂,对初学者不太友好. 后者 ...
- 远程调用get和post请求 将返回结果转换成实体类
package org.springblade.desk.utils; import org.apache.http.client.ResponseHandler; import org.apache ...