MongoDB查看执行计划
简介
MongoDB的 explain() 函数可以帮助我们查看查询相关的信息,这有助于快速定位查询瓶颈。
基本用法
基本命令
db.dev.find({name:/^zhang/, age:{$gt:15}}).explain()
直接跟在 find() 函数后面,表示查看 find() 函数的执行计划,结果如下:

{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "xwj_db.dev", "indexFilterSet" : false, "parsedQuery" : { "$and" : [ { "age" : { "$gt" : 15.0 } }, { "name" : { "$regex" : "^zhang" } } ] }, "queryHash" : "ADEBB940", "planCacheKey" : "5F8D7E6C", "winningPlan" : { "stage" : "FETCH", "filter" : { "age" : { "$gt" : 15.0 } }, "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "name" : 1.0 }, "indexName" : "idx_name", "isMultiKey" : false, "multiKeyPaths" : { "name" : [] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "name" : [ "[\"zhang\", \"zhanh\")", "[/^zhang/, /^zhang/]" ] } } }, "rejectedPlans" : [] }, "serverInfo" : { "host" : "mongo", "port" : 27017, "version" : "4.2.11", "gitVersion" : "ea38428f0c6742c7c2c7f677e73d79e17a2aab96" }, "ok" : 1.0 }
返回结果包含两大块信息:一个是 queryPlanner,即查询计划,还有一个是serverInfo,即MongoDB服务的一些信息。
查询计划 queryPlanner 中,参数比较多,挑几个比较重要的参数说明下:
参数 | 含义 |
plannerVersion | 查询计划版本 |
namespace | 要查询的集合 |
indexFilterSet | 是否应用了index filter |
parsedQuery | 查询条件 |
winningPlan | 最佳执行计划 |
winningPlan.stage |
查询方式,常见的有: COLLSCAN/全表扫描、IXSCAN/索引扫描、FETCH/根据索引去检索文档、 SHARD_MERGE/合并分片结果、IDHACK/针对_id进行查询、SORT/在内存中进行排序 |
winningPlan.filter | 过滤条件 |
winningPlan.inputStage.keyPattern | 索引规则。这里是name正序 |
winningPlan.inputStage.indexName | 索引名称 |
winningPlan.inputStage.isMultiKey | 本次查询是否使用了多键、复合索引 |
winningPlan.inputStage.direction | 查询顺序:正序是forward,倒序是backward |
winningPlan.inputStage.direction | 所扫描的索引范围 |
参数
explain() 函数也可以接收不同参数,通过设置不同参数可以查看更详细的查询计划。
参数包括:queryPlanner(缺省)、executionStats、allPlansExecution
执行explain("executionStats"),会发现执行计划中多了一些统计信息(其它信息跟上面一样,这里省略),如下:

"executionStats" : { "executionSuccess" : true, "nReturned" : 1, "executionTimeMillis" : 0, "totalKeysExamined" : 3, "totalDocsExamined" : 3, "executionStages" : { "stage" : "FETCH", "filter" : { "age" : { "$gt" : 15.0 } }, "nReturned" : 1, "executionTimeMillisEstimate" : 0, "works" : 4, "advanced" : 1, "needTime" : 2, "needYield" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "docsExamined" : 3, "alreadyHasObj" : 0, "inputStage" : { "stage" : "IXSCAN", "nReturned" : 3, "executionTimeMillisEstimate" : 0, "works" : 4, "advanced" : 3, "needTime" : 0, "needYield" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "keyPattern" : { "name" : 1.0 }, "indexName" : "idx_name", "isMultiKey" : false, "multiKeyPaths" : { "name" : [] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "name" : [ "[\"zhang\", \"zhanh\")", "[/^zhang/, /^zhang/]" ] }, "keysExamined" : 3, "seeks" : 1, "dupsTested" : 0, "dupsDropped" : 0 } } }
executionStats参数含义:
参数 | 含义 |
totalKeysExamined | 索引扫描次数 |
totalDocsExamined | 文档扫描次数 |
nReturned | 返回的结果数 |
executionTimeMillis | 执行耗时 |
executionSuccess | 是否执行成功 |
知识改变世界
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了