zoukankan      html  css  js  c++  java
  • 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
    }
    View Code

    返回结果包含两大块信息:一个是 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
            }
        }
    }
    View Code

    executionStats参数含义:

    参数 含义
    totalKeysExamined 索引扫描次数
    totalDocsExamined 文档扫描次数
    nReturned 返回的结果数
    executionTimeMillis 执行耗时
    executionSuccess 是否执行成功

      

    知识改变世界
  • 相关阅读:
    最新 乐游网络java校招面经 (含整理过的面试题大全)
    最新 吉比特java校招面经 (含整理过的面试题大全)
    最新 拉卡拉java校招面经 (含整理过的面试题大全)
    最新 东方财富java校招面经 (含整理过的面试题大全)
    MyBatis全局配置文件
    MyBatis接口式编程(SqlSession直接调用API向接口转变)
    MyBatis-01(HelloWorld)
    SpringMVC
    Mybatis----逆向工程
    spring和mybatis整合
  • 原文地址:https://www.cnblogs.com/xuwenjin/p/15217282.html
Copyright © 2011-2022 走看看