MongoDB——explain()和hint()

2023-05-16

explain()

explain()能够提供大量与查询相关的信息。对于速度比较慢的查询来说,这是最重要的诊断工具之一。通过查看一个查询的explain()输出信息,可以知道查询使用了哪个索引,以及是如何使用的。对于任意查询,都可以在最后添加一个explain()调用(与调用sort()或者limit()一样,不过explain()必须放在最后)。

最常见的explain()输出有两种类型:使用索引的查询和没有使用索引的查询。对于特殊类型的索引,生成的查询计划可能会有些许不同,但是大部分字段都是相以的。另外,分片返回的是多个explain()的聚合,因为查询会在
多个服务器上执行。不使用索引的查询的exlpain()是最基本的explain()类型。如果一个查询不使用索引,是因为它使用了"BasicCursor"(基本游标)。反过来说,大部分使用索引的查询使用的是BtreeCursor(某些特殊类型的索引,比如地理空间索引,使用的是它们自己类型的游标)。

对于使用了复合索引的查询,最简单的情况下的explain()如下:

db.users.find({"age": 42}).explain()

{ explainVersion: '1',
  queryPlanner: 
   { namespace: 'test.users',
     indexFilterSet: false,
     parsedQuery: { age: { '$eq': 42 } },
     maxIndexedOrSolutionsReached: false,
     maxIndexedAndSolutionsReached: false,
     maxScansToExplodeReached: false,
     winningPlan: 
      { stage: 'FETCH',
        inputStage: 
         { stage: 'IXSCAN',
           keyPattern: { age: 1, username: 1 },
           indexName: 'age_1_username_1',
           isMultiKey: false,
           multiKeyPaths: { age: [], username: [] },
           isUnique: false,
           isSparse: false,
           isPartial: false,
           indexVersion: 2,
           direction: 'forward',
           indexBounds: { age: [ '[42, 42]' ], username: [ '[MinKey, MaxKey]' ] } } },
     rejectedPlans: [] },
  command: { find: 'users', filter: { age: 42 }, '$db': 'test' },
  serverInfo: 
   { host: 'zhangchenglongdeMacBook-Pro.local',
     port: 27017,
     version: '5.0.17',
     gitVersion: '197466e20bef76222c1ad85204633163beba3009' },
  serverParameters: 
   { internalQueryFacetBufferSizeBytes: 104857600,
     internalQueryFacetMaxOutputDocSizeBytes: 104857600,
     internalLookupStageIntermediateDocumentMaxSizeBytes: 104857600,
     internalDocumentSourceGroupMaxMemoryBytes: 104857600,
     internalQueryMaxBlockingSortMemoryUsageBytes: 104857600,
     internalQueryProhibitBlockingMergeOnMongoS: 0,
     internalQueryMaxAddToSetBytes: 104857600,
     internalDocumentSourceSetWindowFieldsMaxMemoryBytes: 104857600 },
  ok: 1 }

基本用法

// find方法分析结构
db.collection.find({}).explain();

// aggregate方法的分析结果
db.collection.explain().aggregate([]);

explain有三种模式:

  • queryPlanner(默认):使用queryPlanner只列出所有可能执行的方案,不会执行实际的语句,显示已经胜出的方案winningPlan。
  • executionStats:使用executionStats只执行winningPlan方案,并输出结果。
  • allPlansExecution:使用allPlansExecution执行所有的方案,并输出结果。

不用模式的用法:

// executionStats 模式, 给explain函数传递参数即可
db.collection.find({}).explain('executionStats');

// allPlansExecution 模式
db.collection.find({}).explain('allPlansExecution');

explain内容解读

queryPlanner内容:

queryPlanner:Object //查询计划版本
	namespace:"test.users" //要查询的集合
	indexFilterSet:false //是否使用索引(针对该query是否有indexfilter)
	parsedQuery:Object //查询条件
		age:Object
			$eq:42
	maxIndexedOrSolutionsReached:false
	maxIndexedAndSolutionsReached:false
	maxScansToExplodeReached:false
	winningPlan:Object //最佳执行计划
		stage:"FETCH" //查询方式
		inputStage:Object //用来描述子stage,并且为父stage提供文档和索引关键字
			stage:"IXSCAN" //index scanning
			keyPattern:Object //所扫描的index内容
				age:1
				username:1
			indexName:"age_1_username_1" //所用的索引名
			isMultiKey:false //是否Multikey,如果索引建立在array上,此处为true
			multiKeyPaths:Object
				age:Array
				username:Array
			isUnique:false //是否唯一索引
			isSparse:false //是否系数矩阵索引
			isPartial:false //是否部分索引
			indexVersion:2 //索引版本
			direction:"forward" //此query的查询顺序,如果用了.sort({xxx: -1})将为backward
			indexBounds:Object //winningplan所扫描的索引范围,如果没有制定范围就是[MaxKey, MinKey],这主要是直接定位到mongodb的chunck中去查找数据,加快数据读取。
				age:Array
					0:"[42, 42]"
				username:Array
					0:"[MinKey, MaxKey]"
	rejectedPlans:Array //拒绝的执行计划(其他执行计划(非最优而被查询优化器reject的)的详细返回,其中具体信息与winningPlan的返回中意义相同,故不在此赘述) 

stage阶段类型如下:

  • COLLSCAN:全表扫描
  • IXSCAN:索引扫描
  • FETCH:根据索引去检索指定document
  • SHARD_MERGE:将各个分片返回数据进行merge
  • SORT:表明在内存中进行了排序
  • LIMIT:使用limit限制返回数
  • SKIP:使用skip进行跳过
  • IDHACK:针对_id进行查询
  • SHARDING_FILTER:通过mongos对分片数据进行查询
  • COUNT:利用db.coll.explain().count()之类进行count运算
  • COUNTSCAN: count不使用Index进行count时的stage返回
  • COUNT_SCAN: count使用了Index进行count时的stage返回
  • SUBPLA:未使用到索引的$or查询的stage返回
  • TEXT:使用全文索引进行查询时候的stage返回
  • PROJECTION:限定返回字段时候stage的返回

executionStats内容解读

executionStats:Object
	executionSuccess:true //查询是否成功
	nReturned:1 //返回的结果数
	executionTimeMillis:0 //执行耗时
	totalKeysExamined:1 //索引扫描个数
	totalDocsExamined:1 //文档扫描个数
	executionStages:Object //执行状态
		stage:"FETCH" // 扫描方式
		nReturned:1 //查询结果数量
		executionTimeMillisEstimate:0 //预估耗时
		works:2 //工作单元数,一个查询会分解成小的工作单元
		advanced:1 //优先返回的结果数
		needTime:0
		needYield:0
		saveState:0
		restoreState:0
		isEOF:1
		docsExamined:1 //文档检查数目,与totalDocsExamined一致。检查了总共的个documents,而从返回上面的nReturne数量
		alreadyHasObj:0
	inputStage:Object
		stage:"IXSCAN"
		nReturned:1
		executionTimeMillisEstimate:0
		works:2
		advanced:1
		needTime:0
		needYield:0
		saveState:0
		restoreState:0
		isEOF:1
		keyPattern:Object
			age:1
			username:1
		indexName:"age_1_username_1"
		isMultiKey:false
		multiKeyPaths:Object
			age:Array
			username:Array
		isUnique:false
		isSparse:false
		isPartial:false
		indexVersion:2
		direction:"forward"
		indexBounds:Object
			age:Array
				0:"[42, 42]"
			username:Array
				0:"[MinKey, MaxKey]"
		keysExamined:1
		seeks:1
		dupsTested:0
		dupsDropped:0
	allPlansExecution:Array

hint()

如果发现MongoDB使用的索引与自己希望它使用的索引不一致,可以使用hint()强制MongoDB使用特定的索引。例如,如果希望MongoDB在上个例子的查询中使用{"username":1,"age":1}索引,可以这么做:

db.c.find({"age":14,"username":/.*/}).hint({"username"1,"age"1})

如果查询没有使用你希望它使用的索引,于是你使用hint强制MongoDB使用某个索引,那么应该在应用程序部署之前在所指定的索引上执行explain()。如果强制MongoDB在某个查询上使用索引,而这个查询不知道如何使用这个索引,这样会导致查询效率降低,还不如不使用索引来得快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB——explain()和hint() 的相关文章

随机推荐

  • 计算机远程桌面自动关闭,windows10重启之后自动关闭远程桌面是怎么回事

    首先 xff0c 请大家打开Win 10系统桌面主页面 xff0c 在桌面页面中点击开始菜单 xff0c 在弹出的开始菜单中点击选择 设置 选项 xff0c 进入Win10系统设置页面 在Win10系统设置页面中 xff0c 点击选择 更新
  • openwrt issues

    1 ssh 没密码不让登录 解决方法 xff1a 使用串口登录上 passwd root 设置密码后 etc init d dropbear restart 发现option BannerFile 39 etc banner 39 被屏蔽掉
  • 图片样本集

    图像识别训练样本集 ImageNet ImageNet是一个计算机视觉系统识别项目 xff0c 是目前世界上图像识别最大的数据库 是美国斯坦福的计算机科学家李飞飞模拟人类的识别系统建立的 能够从图片识别物体 目前已经包含14197122张图
  • ubuntu16.10安装网易云音乐

    首先去官网 xff08 https music 163 com download xff09 下载安装包 xff1a netease cloud music 1 1 0 amd64 ubuntu deb 下载好以后 xff0c 执行安装命令
  • 安装 protoc 的各种坑

    首先下载 protoc 2 6 1 https github com google protobuf releases download v2 6 1 protobuf 2 6 1 tar gz https pkgs org downloa
  • 在mysql中创建视图需要使用什么语句_mysql如何创建视图?创建语句是什么?

    在mysql中 xff0c 可以使用 CREATE VIEW 语句来创建视图 xff0c 语法格式为 CREATE VIEW AS xff1b 其中 不能包含FROM子句中的子查询 xff0c 不能引用预处理语句参数 推荐教程 xff1a
  • 正则表达式学习

    1 正则表达式规则 1 1 普通字符 字母 数字 汉字 下划线 以及后边章节中没有特殊定义的标点符号 xff0c 都是 34 普通字符 34 表达式中的普通字符 xff0c 在匹配一个 字符串的时候 xff0c 匹配与之相同的一个字符 举例
  • 在Windows、Mac和 Linux系统中安装Python与 PyCharm

    工欲善其事 必先利其器 xff0c 本文介绍 Python环境的安装和 Python的集成开发环境 IDE PyCharn的安装 一 Python安装 Windows Mac和 Linux 当前主流的 Python版本为2x和3x 由于 P
  • Linux入门-安装篇(Debian 服务器版)

    本文描述了安装一个Linux xff08 Debian xff09 服务器的全过程 xff0c 并附加了一些必要的参考文章 xff0c 通篇以Debian为基础 xff0c 以建立一个服务器 xff08 非桌面环境 xff09 为主要目的
  • MongoDB——写出错机制

    写出错机制 MongoDB的写操作命令默认是没有任何出错返回值的 xff0c 这减少了写操作的等待时间 xff0c 也就是说 xff0c 不管有没有写入到磁盘或者有没有遇到错误 xff0c 它都不会报错 这在大量插 入类似GPS定位坐标信息
  • git入门1

    2016 04 23 19 25 02 参考 xff1a http blog jobbole com 78960 Git bash中运行git log之后怎样终止这个命令 xff0c 按q 再按回车键 清屏 clear 查询用户名 git
  • mysql查看库表的大小_MySQL查看数据库大小和表大小的方法

    MySQL查看数据库大小和表大小的方法 其实很简单 xff0c 就不多说了 xff0c 基本上看得懂代码都明白 查看MySQL数据库大小 SELECT table schema Database Name sum data length 4
  • 按键控制led灯亮灭c语言实验报告,嵌入式STM32学习笔记之按键查询方式控制led灯的亮灭...

    其实接触STM32已经快半年了 xff0c 端断续续的也学习了一下的STM32的各个模块的基本功能 xff0c 刚开始的时候也是看比人的写的代码 xff0c 看懂了然后再去修改 xff0c 能够在自己的平台上实现基本的功能 xff0c 也就
  • iOS 开发比较实用的框架总结(上)

    iOS开发比较实用的框架总结 下拉刷新类型的框架 EGOTableViewPullRefresh https github com enormego EGOTableViewPullRefresh 最早的下拉刷新控件 SVPullToRef
  • Linux使用远程X Server显示图形

    背景 通常我们不希望在服务器上安装图形界面 xff0c 但有时候有些程序需要图形界面 xff0c 比如安装oracle的时候 此时 xff0c 可以配置让Linux使用远程的X Server进行图形界面显示 首先要明确的是Linux X W
  • Linux socket-编程入门(TCP server 端)

    原文完整内容 通常 xff0c socket编程总是Client Server形式的 xff0c 因为有了telnet xff0c 先不考虑client的程序 xff0c 先写一个支持TCP协议的server端 xff0c 然后用telne
  • Anaconda 安装和使用

    最近看了些关于数据分析的书 xff0c 想系统的整理下相关知识 xff0c 算是学习笔记吧 xff0c 也希望能帮到初学者 1 Anaconda介绍 安装python的方法有很多种 xff0c 数据分析方面比较常用Anaconda Anac
  • PTN设备中为什么不支持PHP,ptn和otn的区别是什么

    区别 xff1a OTN是光传输网 xff0c 是从传统的波分技术演进而来 xff0c 主要加入了智能光交换功能 xff0c 可以通过数据配置实现光交叉而不用人为跳纤 xff1b 而PTN是分组传输网 xff0c 是传送网与数据网融合的产物
  • UITableViewController的使用

    如果整个程序界面都只是使用UITableView来搭建 xff0c 一般需要如下步骤 xff1a xff08 1 xff09 向界面上拖一个UITableView xff08 2 xff09 设置数据源 xff08 3 xff09 设置代理
  • MongoDB——explain()和hint()

    explain explain 能够提供大量与查询相关的信息 对于速度比较慢的查询来说 xff0c 这是最重要的诊断工具之一 通过查看一个查询的explain 输出信息 xff0c 可以知道查询使用了哪个索引 xff0c 以及是如何使用的