MongoDB查询分析explain

explain 是 MongoDB 的一个重要的查询诊断工具,这个函数能够提供大量的查询相关的信息,该函数会返回查询计划、执行状态、服务器信息,根据这些信息可以针对性的对性能进行优化。

MongoDB explain函数详解

语法

cursor.explain(verbosity)

查看 db.collection.find() 的执行查询计划信息时,explain() 的使用方法如下:

db.collection.find().explain()

参数

参数 描述
verbose 可选参数,指定冗长模式的解释输出,指定后影响 explain 的行为以及输出信息。
可选值有:queryPlaner、executionStats 和 allPlansExecution,默认为 queryPlaner

返回值

参数 描述
queryPlanner 描述当前的查询计划
queryPlanner.namespace 描述当前的集合命名空间,{db}.{collectionName}
queryPlanner.indexFilterSet 是否设置了 indexFilter,Filter 决定了查询优化器对于某个查询将如何使用索引
queryPlanner.parsedQuery 解析后的查询信息
queryPlanner.winningPlan 最优计划
queryPlanner.rejectPlans 拒绝的计划列表
executionStats 执行过程统计,捕获计划在执行过程中的相关信息
executionStats.executionSuccess 是否执行成功
executionStats.nReturned 返回条目数量
executionStats.executionTimeMilis 执行时间(ms)
executionStats.totalKeysExamined 索引检测条目
executionStats.totalDocsExamined 文档检测条目
executionStats.executionStages 执行阶段详情

explain三种模式

explain 有三种模式:

模式 说明
queryPlanner 这是默认模式,queryPlanner 模式下并不会去真正进行 query 语句查询,而是针对 query 语句进行执行计划分析并选出 winning plan。简单来说就是优化查询。
executionStats 字面意思,返回优化查询(winning plan)执行的详细信息。
allPlansExecution 这种模式除了 winning plan 还包括其他方案的执行的详细信息。

explain stage类型

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

总结

explain 希望看到的阶段:

  • Fetch+IDHACK
  • Fetch+ixscan
  • Limit+(Fetch+ixscan)
  • PROJECTION+ixscan
  • SHARDING_FILTER+ixscan
  • COUNT_SCAN

explain 不希望看到的阶段:

  • COLLSCAN(全表扫描)
  • SORT(使用 sort 但是无 index)
  • 不合理的 SKIP
  • SUBPLA(未用到 index 的 $or)
  • COUNTSCAN