mongodb之explain命令

我们经常在MongoDB用explain命令查看查询计划信息, mongodb的explainapi在3.0版本之后发生了变化.下面做一下对比,方便在使用不同版本的mongdb时,快速切换:

  1. 3.0之前

    执行explain时会返回如下:

    {
        "cursor" : "BtreeCursor user_1_account_1",
        "isMultiKey" : false,
        "n" : 1,
        "nscannedObjects" : 1,
        "nscanned" : 1,
        "nscannedObjectsAllPlans" : 4,
        "nscannedAllPlans" : 5,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 34,
        "indexBounds" : {
            "user" : [ 
                [ 
                    "123", 
                    "123"
                ]
            ],
            "account" : [ 
                [ 
                    "222", 
                    "222"
                ]
            ]
        },
        "server" : "XXX:7220",
        "filterSet" : false
    }

    字段含义:
    isMultiKey :本次查询是否使用了多键、复合索引
    n : 查询返回的数量
    nscannedObjects :数据库按照索引去磁盘上查找实际文档的次数
    nscanned:查找过的索引条目的数量
    scanAndOrder : 是否在内存中对结果进行了排序
    indexOnly : 是否仅仅使用索引完成了本次查询
    nYields : 本次查询的暂停次数
    millis : 执行本次查询所花费的时间,单位毫秒

  2. 3.0之后

    explain有了queryPlanner(查询优化器选择查询计划的详细信息), executionStats(中标计划执行统计详情), 和allPlansExecution(所有的执行计划)三种信息的区分:

    • 默认为queryPlanner
    • 执行.explain(“executionStats”)返回queryPlanner和executionStats的信息
    • 执行.explain(true)或.explain(“allPlansExecution”),会返回以上三种信息。

    这里需要的是executionStats,执行.explain(“executionStats”),截取executionStats信息如下:

    "executionStats" : {
        "nReturned" : 1,
        "executionTimeMillis" : 1,
        "totalKeysExamined" : 3,
        "totalDocsExamined" : 1,
        "executionStages" : {
            "stage" : "SINGLE_SHARD",
            "nReturned" : 1,
            "executionTimeMillis" : 1,
            "totalKeysExamined" : 3,
            "totalDocsExamined" : 1,
            "totalChildMillis" : NumberLong(0),
            "shards" : [ 
                {
                    "shardName" : "db1",
                    "executionSuccess" : true,
                    "executionStages" : {
                        "stage" : "FETCH",
                        "nReturned" : 1,
                        ·······
                        "inputStage" : {
                            "stage" : "IXSCAN",
                            "nReturned" : 1,
                            "executionTimeMillisEstimate" : 0,
                            "works" : 3,
                            "advanced" : 1,
                            "needTime" : 1,
                            "needYield" : 0,
                            "saveState" : 0,
                            "restoreState" : 0,
                            "isEOF" : 1,
                            "invalidates" : 0,
                            "keyPattern" : {
                                "account" : 1.0,
                                "product" : 1.0,
                                "exten" : 1.0
                            },
                            "indexName" : "account_1_product_1_exten_1",
                            "isMultiKey" : false,
                            "isUnique" : false,
                            "isSparse" : false,
                            "isPartial" : false,
                            "indexVersion" : 1,
                            "direction" : "forward",
                            ·······
                            "keysExamined" : 3,
                            "dupsTested" : 0,
                            "dupsDropped" : 0,
                            "seenInvalidated" : 0
                        }
                    }
                }
            ]
        }

    字段含义:
    nReturned :返回的文档数,对应之前的n。
    executionTimeMillis :执行的时间,对应之前的millis。
    totalKeysExamined:索引整体扫描的文档个数,对应之前的nscanned。
    totalDocsExamined :整体扫描的文档个数,对应之前的nscannedObjects。
    advanced :优先返回给父阶段的中间结果集中文档个数
    isEOF :指定查询阶段是否已经结束
    needYield :过程中被打断的次数
    direction :查询方式

3.这里记录一下queryPlanner里stage的类型的意义

stage 描述
COLLSCAN 全表扫描
IXSCAN 索引扫描
FETCH 根据索引去检索指定document
SHARD_MERGE 各个分片返回数据进行merge
SORT 表明在内存中进行了排序(与前期版本的scanAndOrder:true一致)
SORT_MERGE 表明在内存中进行了排序后再合并
LIMIT 使用limit限制返回数
SKIP 使用skip进行跳过
IDHACK 针对_id进行查询
SHARDING_FILTER 通过mongos对分片数据进行查询
COUNT 利用db.coll.count()之类进行count运算
COUNTSCAN count不使用用Index进行count时的stage返回
COUNT_SCAN count使用了Index进行count时的stage返回
SUBPLA 未使用到索引的$or查询的stage返回
TEXT 使用全文索引进行查询时候的stage返回

详细信息可以去看官方文档:https://docs.mongodb.com/manual/reference/method/db.collection.explain/

你可能感兴趣的:(mongodb)