MongoDB 查询分析
MongoDB 查询分析可以确保我们所建立的索引是否有效,是查询语句性能分析的重要工具。
MongoDB 查询分析常用函数有:explain()
使用 explain()
explain 操作提供了查询信息,使用索引及查询统计等。有利于我们对索引的优化。
explain()
方法的参数如下:
- queryPlanner (默认):使用queryPlanner只列出所有可能执行的方案,不会执行实际的语句,显示已经胜出的方案winningPlan
- executionStats:使用executionStats只执行winningPlan方案,并输出结果。
- allPlansExecution:使用allPlansExecution执行所有的方案,并输出结果。
explain()方法的返回值有:
queryPlanner(查询计划) | 查询优化选择的计划细节和被拒绝的计划 |
queryPlanner.namespace | 一个字符串,运行查询的指定命名空间 |
queryPlanner.indexFilterSet | 一个布尔值,表示MongoDB在查询中是否使用索引过滤 |
queryPlanner.winningPlan | 由查询优化选择的计划文档 |
queryPlanner.winningPlan.stage | 表示查询阶段的字符串 stage阶段类型如下:
|
queryPlanner.winningPlan.inputStage | 表示子过程的文档 |
queryPlanner.winningPlan.inputStages | 表示子过程的文档数组 |
queryPlanner.rejectedPlans | 被查询优化备选并被拒绝的计划数组 |
queryPlanner.nReturned | 匹配查询条件的文档数 |
queryPlanner.executionTimeMillis | 计划选择和查询执行所需的总时间(毫秒数) |
queryPlanner.totalKeysExamined | 扫描的索引总数 |
queryPlanner.totalDocsExamined | 扫描的文档总数 |
queryPlanner.executionStages | 显示执行成功细节的查询阶段树 |
executionStats(执行状态) | 被选中执行计划和被拒绝执行计划的详细说明 |
executionStages.works | 指定查询执行阶段执行的“工作单元”的数量 |
executionStages.advanced | 返回的中间结果数 |
executionStages.needTime | 未将中间结果推进到其父级的工作周期数 |
executionStages.needYield | 存储层要求查询系统产生的锁的次数 |
executionStages.isEOF | 指定执行阶段是否已到达流结束 |
queryPlanner.allPlansExecution | 包含在计划选择阶段期间捕获的部分执行信息,包括选择计划和拒绝计划 |
serverInfo(服务器信息) | MongoDB实例的相关信息: |
serverInfo.winningPlan | 使用的执行计划 |
winningPlan.shards | 包括每个访问片的queryPlanner和serverInfo的文档数组 |
接下来我们在 users 集合中创建 gender 和 user_name 的索引:
db.test.find({name:"zeng"},{age:1,_id:0}).explain()
现在在查询语句中使用 explain :
db.test.find({name:"zeng"},{age:1,_id:0}).explain()
以上的 explain() 查询返回如下结果:
/* 1 */ { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "test.test", "indexFilterSet" : false, "parsedQuery" : { "name" : { "$eq" : "zeng" } }, "winningPlan" : { "stage" : "PROJECTION", "transformBy" : { "age" : 1.0, "_id" : 0.0 }, "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "name" : 1.0, "age" : 1.0 }, "indexName" : "name_1_age_1", "isMultiKey" : false, "multiKeyPaths" : { "name" : [], "age" : [] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "name" : [ "[\"zeng\", \"zeng\"]" ], "age" : [ "[MinKey, MaxKey]" ] } } }, "rejectedPlans" : [] }, "serverInfo" : { "host" : "4a54f41686c0", "port" : 27017, "version" : "4.0.28", "gitVersion" : "af1a9dc12adcfa83cc19571cb3faba26eeddac92" }, "ok" : 1.0 }