MongoDB性能优化——使用explain分析


  • Lv 1

    1、概述

    • 在Oracle中我们能够通过sqlplus或者第三方工具Toad和PL/SQL来查看SQL语句的执行计划,分析性能消耗的情况
    • 而MongoDB 也提供了一个 explain 命令让我们获知系统如何处理查询请求。利用 explain 命令,我们可以很好地观察系统如何使用索引来加快检索,同时可以针对性优化索引

    2、使用explain分析

    • 通过使用explain执行计划来对一些慢语句进行诊断

    • 创建索引

    MongoDB Enterprise testrs:PRIMARY> db.person.ensureIndex({age:1})
    {
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
    }
    MongoDB Enterprise testrs:PRIMARY> db.person.ensureIndex({name:1})
    {
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 2,
        "numIndexesAfter" : 3,
        "ok" : 1
    }
    
    • 查看查询数据语句的执行计划
    MongoDB Enterprise testrs:PRIMARY> db.person.find({age:{$gt:8}}, {name:1}).explain()
    {
        "queryPlanner" : {
            "plannerVersion" : 1,
            "namespace" : "test.person",
            "indexFilterSet" : false,
            "parsedQuery" : {
                "age" : {
                    "$gt" : 8
                }
            },
            "winningPlan" : {
                "stage" : "PROJECTION",
                "transformBy" : {
                    "name" : 1
                },
                "inputStage" : {
                    "stage" : "FETCH",
                    "inputStage" : {
                        "stage" : "IXSCAN",
                        "keyPattern" : {
                            "age" : 1
                        },
                        "indexName" : "age_1",
                        "isMultiKey" : false,
                        "isUnique" : false,
                        "isSparse" : false,
                        "isPartial" : false,
                        "indexVersion" : 1,
                        "direction" : "forward",
                        "indexBounds" : {
                            "age" : [
                                "(8.0, inf.0]"
                            ]
                        }
                    }
                }
            },
            "rejectedPlans" : [ ]
        },
        "serverInfo" : {
            "host" : "ggtest1",
            "port" : 27018,
            "version" : "3.2.8",
            "gitVersion" : "ed70e33130c977bda0024c125b56d159573dbaf0"
        },
        "ok" : 1
    }
    MongoDB Enterprise testrs:PRIMARY>
    

    3、参数字段说明

    • cursor: 返回游标类型(BasicCursor 或 BtreeCursor)
    • nscanned: 被扫描的文档数量
    • n: 返回的文档数量
    • millis: 耗时(毫秒)
    • indexBounds: 所使用的索引
    • isMultiKey:是否使用了多键索引
    • scanAndOrder:是否在内存中对结果集进行了排序
    • indexOnly:是否只使用索引就能完成查询(覆盖索引)

    4、参数补充说明:
    MongoDB 3.0之后,explain的返回与使用方法与之前版本有了不少变化

    • queryPlanner.winningPlan.inputStage.stage列 显示查询策略
    • IXSCAN 表示使用Index 查询
    • 列表COLLSCAN 表示使用列查询,也就是一个一个对比过去,即全表扫描
    • cursor中的索引名称移动到了queryPlanner.winningPlan.inputStage.indexName
    • 3.0中使用executionStats.totalDocsExamined来显示总共需要检查的文档数,用以取代之前的nscanned。

    5、小结

    • 通过查看explain执行计划来分析索引等使用情况,了解到对MongoDB增删改查的消耗情况,然后我们再针对性去做性能优化,看是添加或者删除哪个索引能够达到提升效能的目的,本章性能优化主要是介绍这个explain,后续其他性能优化方案在其他文章中再分享并再详细介绍分析下MongoDB 3.0的变化和特点。

登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待