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