MongoDB性能调优(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语法,但是这些都是暂时解决问题的办法,
最根本的解决还是要从最先的数据库设计开始,所以在设计搭建数据库架构的时候,要先做好各种方案的评估才是数据库优化的
重点所在。