MongoDB——Explain详解扩展

184 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

$lookup

MongoDB 5.0 版本新功能,解释结果包括使用$lookup 管道阶段。包含这些执行的统计信息。必须在executionStagesallPlansExecution模式中执行。

'$lookup': {
   from: <string>,
   as: <string>,
   localField: <string>,
   foreignField: <string>
},
totalDocsExamined: <long>,
totalKeysExamined: <long>,
collectionScans: <long>,
indexesUsed: [ <string_1>, <string_2>, ..., <string_n> ],
nReturned: <long>,
executionTimeMillisEstimate: <long>
key描述
totalDocsExamined扫描文档数
totalKeysExamined扫描索引键数
collectionScans查询执行期间发生集合扫描的次数
indexesUsed查询使用的索引名称
nReturned符合条件的文档数
executinoTimeMillisEstimate查询执行的预估时间,单位:毫秒

Stage状态

状态描述
COLLSCAN全表扫描
IXSCAN索引扫描
FETCH根据索引索引扫描指定文档
SHARD_MERGE讲各个分片数据进行合并
SORT在内存中进行了排序
LIMIT使用$limit 限制返回数
SKIP使用$skip 跳过
IDHACK_id 查询
SHARDING_FILTERmongos分片查询
COUNTSCANcount 不使用index 进行count
COUNT_SCANcount 使用index 进行count
SUBPLA未使用到索引的$or 查询
TEXT使用全文检索查询
PROJECTION限制字段返回

执行计划的结果中尽量不要出现以下stage

  • COLLSCAN
  • 无索引的SORT
  • 不合理的SKIP
  • SUBPLA 未用到索引的$or
  • COUNTSCAN 不使用索引的的计数

覆盖查询

由于所有出现在查询中的字段是索引的一部分,Mongodb无需通过文档扫描匹配查询的结果,因为扫描索引比扫描文档要快的多。而解释结果只有IXSCAN,而不是包含后续的FETCH ,并且totalDocsExamined = 0

  • 所有的查询字段是索引的一部分
  • 所有的查询返回字段在同一个索引中

索引交集

Mongodb 可以使用多个索引的交集来完成查询。通常,每个索引交集涉及到两个索引。结果将包含一个AND_SORTED阶段或者一个AND_HASH 阶段。

例如:

{
   stage : 'AND_SORTED',
   inputStages : [
      {
         stage : 'IXSCAN',
         ...
      },
      {
         stage : 'IXSCAN',
         ...
      }
   ]
}

$or

如果查询中使用了$or 表达式,并包含索引。结果将返回一个OR 阶段

{
   stage: 'OR',
   inputStages: [
      {
         stage: 'IXSCAN',
         ...
      },
      {
         stage : 'IXSCAN',
         ...
      },
      ...
   ]
}