MongoDB性能调优(1)


  • Lv 1

    一、概述

    DB的性能调优也是很重要的部分,我们熟知的Oracle、SQLServer是可以通过查看执行计划后来进行调优,

    同样我们的MongoDB也可以,当然除了查看执行计划,还有其他调优的方法,让我们一起来看一下吧

    二、MongoDB性能调优

    1、查看执行执行

    使用explain()函数来查看分析是否用来全表扫描,是否使用索引,返回查询数据所用时间等信息来判断是否需要优化

    这个在之前的分享的文章中已经有提到,详情可看回之前的文章,这里我们简单说一下

    MongoDB Enterprise > db.test1.find().explain("executionStats")
    {
        "queryPlanner" : {
            "plannerVersion" : 1,
            "namespace" : "test.test1",
            "indexFilterSet" : false,
            "parsedQuery" : {
                "$and" : [ ]
            },
            "winningPlan" : {
                "stage" : "COLLSCAN",
                "filter" : {
                    "$and" : [ ]
                },
                "direction" : "forward"
            },
            "rejectedPlans" : [ ]
        },
        "executionStats" : {
            "executionSuccess" : true,
            "nReturned" : 1,
            "executionTimeMillis" : 0,
            "totalKeysExamined" : 0,
            "totalDocsExamined" : 1,
            "executionStages" : {
                "stage" : "COLLSCAN",
                "filter" : {
                    "$and" : [ ]
                },
                "nReturned" : 1,
                "executionTimeMillisEstimate" : 0,
                "works" : 3,
                "advanced" : 1,
                "needTime" : 1,
                "needYield" : 0,
                "saveState" : 0,
                "restoreState" : 0,
                "isEOF" : 1,
                "invalidates" : 0,
                "direction" : "forward",
                "docsExamined" : 1
            }
        },
        "serverInfo" : {
            "host" : "mongotest1",
            "port" : 27017,
            "version" : "3.2.8",
            "gitVersion" : "ed70e33130c977bda0024c125b56d159573dbaf0"
        },
        "ok" : 1
    }

    从上面返回的一些参数我们可以看出

    "executionTimeMillis" : 0,执行所用时间0

    "stage" : "COLLSCAN",全表扫描

    "indexFilterSet" : false, 没有使用索引

    再根据返回的这些信息从添加索引或者修改查询方式等去优化。

    2、profiling

    a.查看是否开启这功能

    MongoDB Enterprise > db.getProfilingLevel()
    0

    返回的值有0、1、2三种情况:

    0 :表示不开启 1 :表示记录慢命令 (默认是100ms,这个默认值是可以修改的) 2 :表示记录所有命令

     b.设置

    MongoDB Enterprise > db.setProfilingLevel(1,10);
    { "was" : 1, "slowms" : 10, "ok" : 1 }
    MongoDB Enterprise > db.getProfilingLevel();
    1
    

    显然我们已经设置为1,也同时把默认值100改为10

    当然这里有一点需要注意的是

    MongoDB Enterprise > db.setProfilingLevel(0,10);
    { "was" : 1, "slowms" : 10, "ok" : 1 }
    MongoDB Enterprise > db.getProfilingLevel();
    0
    

    我们设置的是0,但是后面带有修改默认值10,这里表示的是Log档会记录时间>10ms的语句

    还有就是开启profiling功能跟很多数据库监控一样也是会消耗系统资源,所以要根据实际情况再使用。

    三、总结

    对于海量数据的查询,我们调优的方式经常会加添加索引,或者调整一些相关的SQL语法,但是这些都是暂时解决问题的办法,

    最根本的解决还是要从最先的数据库设计开始,所以在设计搭建数据库架构的时候,要先做好各种方案的评估才是数据库优化的

    重点所在。


登录后回复
 

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