MongoDB 查询分析

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阶段类型如下:

  • COLLSCAN:全表扫描
  • IXSCAN:索引扫描
  • FETCH:根据索引去检索指定document
  • SHARD_MERGE:将各个分片返回数据进行merge
  • SORT:表明在内存中进行了排序
  • LIMIT:使用limit限制返回数
  • SKIP:使用skip进行跳过
  • IDHACK:针对_id进行查询
  • SHARDING_FILTER:通过mongos对分片数据进行查询
  • COUNT:利用db.coll.explain().count()之类进行count运算
  • COUNTSCAN: count不使用Index进行count时的stage返回
  • COUNT_SCAN: count使用了Index进行count时的stage返回
  • SUBPLA:未使用到索引的$or查询的stage返回
  • TEXT:使用全文索引进行查询时候的stage返回
  • PROJECTION:限定返回字段时候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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小石头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值