MongoDB-CN-Manual
  • MongoDB中文手册|官方文档中文版
  • MongoDB用户手册说明
  • MongoDB简介
    • 入门
    • 数据库和集合
      • 视图
      • 按需物化视图
      • 封顶集合
      • 时间序列集合
    • 文档
    • BSON类型
      • Comparison and Sort Order
      • MongoDB Extended JSON (v2)
      • MongoDB Extended JSON (v1)
  • 安装 MongoDB
    • 安装MongoDB社区版
      • 在Linux上安装MongoDB社区版
      • 在macOS上安装MongoDB社区版
      • 在Windows上安装MongoDB社区版
    • 安装MongoDB企业版
      • 在Linux上安装MongoDB企业版
      • 在Mac OS安装MongoDB企业版
      • 在Windows安装MongoDB企业版
      • 使用Docker安装MongoDB企业版
    • 将社区版MongoDB升级到企业版MongoDB
    • 验证MongoDB软件包的完整性
  • The mongo Shell
    • 配置mongo Shell
    • 使用 mongo Shell帮助
    • 为mongo Shell编写脚本
    • mongo Shell中的数据类型
    • mongo Shell 快速参考
  • MongoDB CRUD操作
    • 插入文档
      • 插入方法
    • 查询文档
      • 在mongo Shell中迭代游标
      • 从查询返回的项目字段
      • 查询嵌入式文档数组
      • 查询数组
      • 查询空字段或缺少字段
      • 查询嵌入/嵌套文档
    • 更新文档
      • 更新方法
      • 聚合管道更新
    • 删除文档
      • 删除方法
    • 地理空间查询
      • 用地理空间查询查找餐馆
      • GeoJSON对象
    • 批量写入操作
    • 可重试写入
    • 可重试读取
    • SQL到MongoDB的映射图表
    • 文本搜索
      • 文本索引
      • 文本索引操作
      • 集合管道中的文本索引
      • 文本索引语言
    • Read Concern读关注
      • 读关注 "local"
      • 读关注 "available"
      • 读关注 "majority"
      • 读关注 "linearizable"
      • 读关注 "snapshot"
    • Write Concern写关注
    • MongoDB CRUD概念
      • 原子性和事务
      • 读隔离性,一致性和近因性
        • 因果一致性和读写关注
      • 分布式查询
      • 通过findAndModify进行线性化读取
      • 查询计划
      • 查询优化
        • 评估当前操作性能
        • 优化查询性能
        • 写操作性能
        • 说明结果
      • 分析查询表现
      • Tailable 游标
  • MongoDB聚合
    • 聚合管道
      • 聚合管道优化
      • 聚合管道限制
      • 聚合管道和分片集合
      • 使用 Zip Code 数据集进行聚合
      • 使用用户首选项数据进行聚合
    • Map-Reduce
      • Map-Reduce 和分片集合
      • Map-Reduce 并发
      • Map-Reduce 示例
      • 执行增量 Map-Reduce
      • 对 Map Function 进行故障排除
      • 排除 Reduce Function 问题
      • Map-Reduce转换到聚合管道
    • 聚合参考
      • 聚合管道快速参考
      • 聚合命令
      • 聚合命令对比
      • 聚合表达式中的变量
      • SQL 到聚合映射图表
  • MongoDB数据模型
    • 数据建模介绍
    • 模式验证
    • 数据模型设计
      • 一对一嵌套关系模型
  • MongoDB事务
  • MongoDB事务
    • 驱动程序 API
    • 生产注意事项
    • 生产注意事项 (分片集群)
    • 事务操作
  • MongoDB索引
    • 单字段索引
    • 复合索引
    • 多键索引
      • 多键索引范围
    • 文本索引
      • 为文本索引指定语言
      • 指定文本索引的名称
      • 用权重控制搜索结果
      • 限制扫描条目的数量
    • 通配符索引
      • 通配符索引限制
    • 2dsphere 索引
      • 查询一个2dsphere索引
    • 2d 索引
      • 创建一个2d索引
      • 查询一个2d索引
      • 2d索引内部
      • 使用球面几何计算距离
    • geoHaystack 索引
      • 创建Haystack索引
      • 查询Haystack索引
    • 哈希索引
    • 索引特性
      • TTL 索引
        • 通过设置TTL使集合中的数据过期
      • 唯一索引
      • 部分索引
      • 不分大小写索引
      • Sparse 索引
    • 在填充的集合上建立索引
      • 在副本集上建立滚动索引
      • 在分片群集上建立滚动索引
    • 索引交集
    • 管理索引
    • 衡量索引使用
    • 索引策略
      • 创建索引来支持查询
      • 使用索引对查询结果进行排序
      • 确保索引适合RAM
      • 创建以确保选择性的查询
    • 索引参考
  • MongoDB安全
    • 安全检查列表
    • 启用访问控制
    • 身份验证
      • 用户
        • 添加用户
        • 权限认证机制
          • SCRAM
            • 用x.509证书来认证客户端
    • 审计
      • 配置审计过滤器
      • 配置审计
      • 系统事件审计消息
    • 网络和配置强化
    • 安全参考
      • system.roles集合
      • system.users集合
      • 资源文档
      • 权限操作
    • 附录
      • 附录-A-用于测试的 OpenSSl CA 证书
      • 附录-B-用于测试的OpenSSL服务器证书
      • 附录-C-用于测试的OpenSSL客户端证书
  • Change Streams变更流
    • 变更流生产建议
    • 变更事件
  • MongoDB复制
    • 副本集成员
    • 副本集日志
    • 副本集数据同步
    • 副本集部署架构
    • 副本集成员配置教程
    • 副本集维护教程
    • MongoDB复制参考
  • MongoDB分片
    • 分片集群组件
    • 分片键
    • 哈希分片
    • 范围分片
    • 区
      • 管理分片区
      • 按位置细分数据
      • 用于更改SLA或SLO的分层硬件
      • 按应用或客户细分数据
      • 仅插入工作负载的分布式本地写入
      • 管理分片区
    • 使用块进行数据分区
      • 在分片集群中拆分数据块
    • 分片管理
      • 查看集群设置
    • 重启一个分片集群
    • [把一个分片集群迁移到不同的硬件](fen-pian/migrate-a -sharded-cluster-to-different-hardware.md)
    • 分片参考
  • MongoDB管理
    • 产品说明
    • 操作检查列表
    • 开发检查列表
    • 配置和维护
    • 性能
    • 数据中心意识
      • MongoDB部署中的工作负载隔离
      • 区
        • 管理分片区
        • 按位置细分数据
        • 用于更改SLA或SLO的分层硬件
        • 按应用或客户细分数据
        • 仅插入工作负载的分布式本地写入
        • 管理分片区
    • MongoDB备份方法
    • MongoDB监控
  • MongoDB存储
    • 存储引擎
      • WiredTiger 存储引擎
      • 内存存储引擎
    • 日志记录
      • 管理日志记录
        • GridFS
        • FAQ:MongoDB 存储
  • MongoDB参考
    • 运算符
      • 查询与映射运算符
        • 比较查询运算符
          • $eq
          • $gt
          • $gte
          • $in
          • $lt
          • $lte
          • $ne
          • $nin
        • 逻辑查询运算符
          • $and
          • $not
          • $nor
          • $or
        • 元素查询运算符
        • 评估查询运算符
        • 地理空间查询运算符
        • 数组查询运算符
        • 按位查询运算符
        • $comment
        • 映射运算符
      • 更新运算符
        • 字段更新运算符
        • 数组更新运算符
        • 按位更新运算符
      • 聚合管道阶段
      • 聚合管道操作符
        • $abs (aggregation)
        • $acos (aggregation)
        • $acosh (aggregation)
        • $add (aggregation)
        • $addToSet (aggregation)
        • $allElementsTrue (aggregation)
        • $and (aggregation)
        • $anyElementTrue (aggregation)
        • $arrayElemAt (aggregation)
        • $arrayToObject (aggregation)
        • $asin (aggregation)
        • $asinh (aggregation)
        • $atan (aggregation)
        • $atan2 (aggregation)
        • $atanh (aggregation)
        • $avg (aggregation)
        • $ceil (aggregation)
        • $cmp (aggregation)
        • $concat (aggregation)
        • $concatArrays (aggregation)
        • $cond (aggregation)
        • $convert (aggregation)
        • $cos (aggregation)
        • $dateFromParts (aggregation)
        • $dateToParts (aggregation)
        • $dateFromString (aggregation)
        • $literal (aggregation)
      • 查询修饰符
    • 数据库命令
      • 聚合命令
      • 地理空间命令
      • 查询和写操作命令
      • 查询计划缓存命令
      • 认证命令
      • 用户管理命令
      • 角色管理命令
      • 复制命令
      • 分片命令
      • 会话命令
      • 管理命令
      • 诊断命令
      • 免费监控命令
      • 系统事件审计命令
    • mongo Shell 方法
      • 集合方法
        • db.collection.aggregate()
        • db.collection.bulkWrite()
        • db.collection.copyTo()
        • db.collection.count()
        • db.collection.countDocuments()
        • db.collection.estimatedDocumentCount()
        • db.collection.createIndex()
        • db.collection.createIndexes()
        • db.collection.dataSize()
        • db.collection.deleteOne()
        • db.collection.deleteMany()
        • db.collection.distinct()
        • db.collection.drop()
        • db.collection.dropIndex()
        • db.collection.dropIndexes()
        • db.collection.ensureIndex()
        • db.collection.explain()
        • db.collection.find()
        • db.collection.findAndModify()
        • db.collection.findOne()
        • db.collection.findOneAndDelete()
        • db.collection.findOneAndReplace()
        • db.collection.findOneAndUpdate()
        • db.collection.getIndexes()
        • db.collection.getShardDistribution()
        • db.collection.getShardVersion()
        • db.collection.insert()
        • db.collection.insertOne()
        • db.collection.insertMany()
        • db.collection.isCapped()
        • db.collection.latencyStats()
        • db.collection.mapReduce()
        • db.collection.reIndex()
        • db.collection.remove()
        • db.collection.renameCollection()
        • db.collection.replaceOne()
        • db.collection.save()
        • db.collection.stats()
        • db.collection.storageSize()
        • db.collection.totalIndexSize()
        • db.collection.totalSize()
        • db.collection.update()
        • db.collection.updateOne()
        • db.collection.updateMany()
        • db.collection.watch()
        • db.collection.validate()
    • MongoDB中的限制与阈值
    • MongoDB系统集合
    • 词汇表
    • 默认的MongoDB端口
    • 默认的MongoDB读/写关注
    • 服务器会话
  • MongoDB FAQ
    • FAQ: MongoDB基础知识
    • FAQ: MongoDB索引
    • FAQ: MongoDB并发
    • FAQ: MongoDB分片
    • FAQ: MongoDB复制和副本集
    • FAQ: MongoDB存储
    • FAQ: MongoDB诊断
  • MongoDB 版本管理
  • 联系我们
    • Tapdata Cloud
    • MongoDB中文社区
    • 社区合作伙伴—锦木信息
由 GitBook 提供支持
在本页
  • 解释输出
  • queryPlanner
  • executionStats
  • serverInfo
  • 3.0格式变更
  • 集合扫描与索引使用
  • 覆盖查询
  • 索引交集
  • $or表达式
  1. MongoDB CRUD操作
  2. MongoDB CRUD概念
  3. 查询优化

说明结果

上一页写操作性能下一页分析查询表现

最后更新于3年前

在本页面

为了返回查询计划的信息和查询计划的执行统计信息,MongoDB提供:

  • 方法,

  • 方法,

  • 该命令。

explain结果将查询计划呈现为一个阶段树。

"winningPlan" : {
   "stage" : <STAGE1>,
   ...
   "inputStage" : {
      "stage" : <STAGE2>,
      ...
      "inputStage" : {
         "stage" : <STAGE3>,
         ...
      }
   }
},

每个阶段将其结果(即文档或索引键)传递给父节点。叶节点访问集合或索引。内部节点操作子节点产生的文档或索引键。根节点是MongoDB派生结果集的最后一个阶段。

阶段描述了操作;例如

  • COLLSCAN 用于收集扫描

  • IXSCAN 用于扫描索引键

  • FETCH 用于检索文件

  • SHARD_MERGE 用于合并分片的结果

  • SHARDING_FILTER 用于从分片中筛选出孤立文档

解释输出

以下各节列出了该explain操作返回的一些关键字段。

注意

  • 字段列表并不意味着详尽无遗,而只是强调了早期解释版本中的一些关键字段更改。

  • 输出格式在各个发行版之间可能有所更改。

queryPlanner

  • 未分片集合

  • 分片集合

explain.queryPlanner

  • explain.queryPlanner.``namespace

    一个字符串,它指定<database>.<collection>要对其运行查询的名称空间(即 )。

  • explain.queryPlanner.``indexFilterSet

  • explain.queryPlanner.``queryHash

注意

与任何散列函数一样,两个不同的查询形状可能导致相同的散列值。但是,不同查询形状之间不太可能出现哈希冲突。

只有当值为true且仅应用于聚合管道操作中的explain时,该字段才会出现。当为true时,由于管道已被优化,所以在输出中不会出现聚合阶段信息。

新版本4.2

explain.queryPlanner.winningPlan

​ 详细说明查询优化器选择的计划的文档。MongoDB将计划呈现为一个阶段树;例如,一个阶段可以有一个inputStage,如果该阶段有 多个子阶段,则可以有inputStage。

​ explain.queryPlanner.winningPlan.stage

​ 表示舞台名称的字符串。

​ 每个阶段由特定于该阶段的信息组成。例如,IXSCAN阶段将包括索引边界以及特定于索引扫描的其他数据。如果一个阶段有一个子 阶段或多个子阶段,那么这个阶段将有一个inputStage或inputStage。

​ explain.queryPlanner.winningPlan.inputStage

​ 描述子阶段的文档,它向父阶段提供文档或索引键。如果父阶段只有一个子阶段,则会显示该字段。

​ explain.queryPlanner.winningPlan.inputStages

​ explain.queryPlanner.rejectedPlans

​ 查询优化器考虑和拒绝的候选计划的数组。如果没有其他候选计划,则该数组可以为空。

executionStats

  • 未分片集合

  • 分片集合

explain.executionStats.executionStages

​ 以阶段树的形式详细说明获奖计划的完成执行情况;即一个阶段可以有一个inputStage或多个 inputStages。

​ explain.executionStats.executionStages.works

​ 指定查询执行阶段执行的“工作单位”的数量。查询执行将其工作分为几个小单元。“工作单元”可能包括检查单个索引键,从集合中获 取单个文档,对单个文档应用投影或进行内部簿记。

​ explain.executionStats.executionStages.advanced

​ 在此阶段返回到其父阶段的中间结果数,或将其_前进_。

​ explain.executionStats.executionStages.needTime

​ explain.executionStats.executionStages.needYield

​ 存储层请求查询阶段挂起处理并产生其锁的次数。

​ explain.executionStats.executionStages.saveState

​ 查询阶段挂起处理并保存其当前执行状态的次数,例如,为准备产生锁而做的准备。

​ explain.executionStats.executionStages.restoreState

​ 查询阶段恢复保存的执行状态的次数,例如,在恢复之前已产生的锁之后。

​ explain.executionStats.executionStages.isEOF

​ 指定执行阶段是否已到达流的末尾:

​ 如果true或1,则执行阶段已到达流的末尾。

​ 如果false或0,则阶段可能仍会返回结果。例如,考虑一个具有限制的查询,其执行阶段由查询LIMIT的输入阶段组

​ 成IXSCAN。如果查询返回的值超过指定的限制,则该LIMIT阶段将报告,但其基础阶段将报告。isEOF: 1IXSCANisEOF: 0

​ explain.executionStats.executionStages.inputStage.keysExamined

​ 对于扫描索引的查询执行阶段(例如IXSCAN), keysExamined是在索引扫描过程中检查的入站和出站键的总数。如果索引扫描 由单个连续范围的键组成,则仅需要检查入站键。如果索引范围由几个键范围组成,则索引扫描执行过程可能会检查越界键,以便 从一个范围的末尾跳到下一个范围的末尾。

考虑以下示例,其中有一个字段索引, x并且集合包含100个文档,其x值从1到100:

db.keys.find( { x : { $in : [ 3, 4, 50, 74, 75, 90 ] } } ).explain( "executionStats" )

​ 查询将扫描键3和4。然后它将扫描键5,检测它是否超出范围,并跳到下一个键50。

​ 继续这个过程,查询扫描键3、4、5、50、51、74、75、76、90和91。键5,51,76和91是仍在检查的超出范围的

​ 键。keysExamined的值为10。

​ explain.executionStats.executionStages.inputStage.docsExamined

​ 指定在查询执行阶段扫描的文档数量。

​ 用于COLLSCAN阶段,以及从集合检索文档的阶段(例如FETCH)

​ explain.executionStats.executionStages.inputStage.seeks

​ 版本3.4中的新特性:仅用于索引扫描**(IXSCAN)**阶段。

​ 为了完成索引扫描,我们必须将索引游标查找到新位置的次数。

explain.executionStats.allPlansExecution

​ 包含在计划选择阶段捕获的胜出计划和被否决计划的部分执行信息。只有当explain在所有计划执行冗长模式下运行时,该字段才 会出现。

serverInfo

  • 未分片集合

  • 分片集合

对于未分片的集合,explain返回serverInfoMongoDB实例的以下 信息:

“ serverInfo”:{ 
   “ host”:<string>,
   “ port”:<int>,
   “ version”:<string>,
   “ gitVersion”:<string> 
}
"queryPlanner" : {
   ...
   "winningPlan" : {
      "stage" : <STAGE1>,
      "shards" : [
         {
            "shardName" : <string>,
            "connectionString" : <string>,
            "serverInfo" : {
               "host" : <string>,
               "port" : <int>,
               "version" : <string>,
               "gitVersion" : <string>
            },
            ...
         }
         ...
      ]
   }
},
"serverInfo" : {      // serverInfo for mongos
  "host" : <string>,
  "port" : <int>,
  "version" : <string>,
  "gitVersion" : <string>
}

3.0格式变更

从MongoDB 3.0开始,结果的格式和字段explain 与以前的版本已更改。以下列出了一些主要区别。

集合扫描与索引使用

如果查询计划者选择了集合扫描,则解释结果将包括一个COLLSCAN阶段。

如果查询计划者选择了索引,则说明结果包括一个 IXSCAN阶段。该阶段包括诸如索引键样式,遍历方向和索引边界之类的信息。

在以前的MongoDB版本中,cursor.explain()返回的 cursor字段值为:

  • BasicCursor 用于收集扫描,

  • BtreeCursor <index name> [<direction>] 用于索引扫描。

覆盖查询

当索引涵盖查询时,MongoDB既可以匹配查询条件**,也**可以仅使用索引键返回结果;即MongoDB无需检查集合中的文档即可返回结果。

在MongoDB的早期版本中,cursor.explain()返回该 indexOnly字段以指示索引是否覆盖查询。

索引交集

{ 
   “ stage”  : “ AND_SORTED” ,
   “ inputStages”  : [ 
      { 
         “ stage”  : “ IXSCAN” ,
         ... 
      },
      { 
         “ stage”  : “ IXSCAN” ,
         ... 
      } 
   ] 
}

在以前的MongoDB版本中,cursor.explain()返回cursor值为index交集的 字段。Complex Plan

$or表达式

复制复制的

{ 
   “ stage”  : “ OR” ,
   “ inputStages”  : [ 
      { 
         “ stage”  : “ IXSCAN” ,
         ... 
      },
      { 
         “ stage”  : “ IXSCAN” ,
         ... 
      },
      ... 
   ] 
}

在MongoDB的早期版本中,cursor.explain()返回clauses详细说明索引的 数组。

分类阶段

如果MongoDB可以使用索引扫描来获取请求的排序顺序,则结果将不包含SORT阶段。否则,如果MongoDB无法使用索引进行排序,则explain结果将包括一个 SORT阶段。

在MongoDB 3.0之前,cursor.explain()返回此 scanAndOrder字段以指定MongoDB是否可以使用索引顺序返回排序的结果。

译者:杨帅

校对:杨帅

信息详细说明了选择的计划。

包含有关选择查询计划的信息 。

一个布尔值,指定MongoDB是否对应用了。

一个十六进制字符串,代表的哈希, 并且仅取决于查询形状。 queryHash可以帮助识别具有相同查询形状的慢查询(包括写操作的查询过滤器)。

​ 一系列描述子阶段的文档。子阶段将文档或索引键提供给父阶段。_如果_父级具有多个子节点,_则_该字段存在。例如,阶 段或会消耗来自多个源的输入。

返回的信息详细说明了获胜计划的执行情况。为了包括 executionStats在结果中,您必须在以下任一位置运行解释:

详细模式。使用allPlansExecution模式包括在期间捕获的部分执行数据。

​ 没有将中间结果提前到其父阶段的工作周期数(请参阅参考资料 )。例 如,索引扫描阶段可能会花费一个工作周期来寻找索引中的新位置,而不是返回索引键。

​ 这个工作周期将计入而非计入

​ 。

对于分片集合,explain返回serverInfo每个访问的分片的,并返回的 顶级 serverInfo对象。

有关收集扫描和索引扫描的执行统计信息的更多信息,请参见。

当索引覆盖查询时,解释结果的IXSCAN 阶段不是该阶段的后代FETCH,而在 ,totalDocsExaminedis是0。

对于,结果将包括一个AND_SORTED阶段或一个AND_HASH 包含详细描述索引的数组的阶段。例如:

如果MongoDB对表达式使用索引,则结果将包括OR带有inputStages详细索引的数组的阶段 ;例如:

queryPlanner
查询优化器
查询优化器
查询形状
索引过滤器
查询形状
$或表达式的
索引交集
executionStats
执行状态
allPlansExecution
计划选择
explain.executionStats.executionStages.advanced
explain.executionStats.executionStages.needTime
explain.executionStats.executionStages.advanced
mongos
分析查询性能
executionStats中
索引交叉计划
inputStages
$or
db.collection.explain()
cursor.explain()
explain
解释输出
queryPlanner
executionStats
serverInfo
3.0格式变更
集合扫描与索引使用
覆盖查询
索引交集
$or 表达