最近MongoDb服务器负载比较高,容易出问题,这里把优化的方式整理一下。

1、由于各个项目组共用一个mongo实例,所以一个项目组的问题会影响到别的项目组,所以需要把各个项目的数据从一个实例中剥离出来。

2、根据请求接口的时间,数量,排查代码上的相关问题,重复查询、查询是否中索引、多次小量数据查询、mongo排序等。

3、优化索引,注意的是创建索引是一个比较重要的事情,如果数据量大,不想影响线上业务,要后台创建索引,在副本集上后台创建索引,primary是没问题的,secondary在同步索引的时候,会阻塞,如果读在secondary上的话,这点需要注意。

4、我们现在的Mongo用的副本集,之前配置成了读写分离,来解决primary的负载较高的问题,后来发现secondary的负载会升高,secondary有跟primary一样的写请求,并且有可能存在数据不同步的问题,副本集的意义在故障切换这块比较大,后期我们会把Mongo由副本集改为分片的部署方式。

索引优化排查:

1、利用explain来查看一个查询的查询过程,

mgset-:SECONDARY> db.userInfo.find({phone_number:''}).explain('executionStats')
{
"queryPlanner" : {              
"plannerVersion" : ,
"namespace" : "source.userInfo",
"indexFilterSet" : false,
"parsedQuery" : {
"phone_number" : {
"$eq" : ""
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"phone_number" :
},
"indexName" : "phone_number_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"phone_number" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : ,
"direction" : "forward",
"indexBounds" : {
"phone_number" : [
"[\"11111\", \"11111\"]"
]
}
}
},
"rejectedPlans" : [ ]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : ,
"executionTimeMillis" : ,
"totalKeysExamined" : ,
"totalDocsExamined" : ,
"executionStages" : {
"stage" : "FETCH",
"nReturned" : ,
"executionTimeMillisEstimate" : ,
"works" : ,
"advanced" : ,
"needTime" : ,
"needYield" : ,
"saveState" : ,
"restoreState" : ,
"isEOF" : ,
"invalidates" : ,
"docsExamined" : ,
"alreadyHasObj" : ,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : ,
"executionTimeMillisEstimate" : ,
"works" : ,
"advanced" : ,
"needTime" : ,
"needYield" : ,
"saveState" : ,
"restoreState" : ,
"isEOF" : ,
"invalidates" : ,
"keyPattern" : {
"phone_number" :
},
"indexName" : "phone_number_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"phone_number" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : ,
"direction" : "forward",
"indexBounds" : {
"phone_number" : [
"[\"11111\", \"11111\"]"
]
},
"keysExamined" : ,
"seeks" : ,
"dupsTested" : ,
"dupsDropped" : ,
"seenInvalidated" :
}
}
},
"ok" :
}

查看executionStats字段会发现FETCH->IXSCAN,表明中索引。

stage各个值的含义:

  • COLLSCAN 全表扫描
  • IXSCAN 索引扫描
  • FETCH 根据索引去检索指定document
  • SHARD_MERGE  将各个分片返回数据进行merge
  • SORT    表明在内存中进行了排序

只是列了几个比较常见的,详细的请参考MongoDB中文社区的干货系列

慢查询日志排查

有一个操作是创建了一个三键索引,删除了两键索引,但是在慢查询日志查看过程中,发现这个查询所中的还是两键索引,在Mongo Shell中,explain查看,中的是三键索引,通过查阅相关资料,Mongo的cache plan影响的

PlanCache help
db.userInfo.getPlanCache().help() - show PlanCache help
db.userInfo.getPlanCache().listQueryShapes() - displays all query shapes in a collection
db.userInfo.getPlanCache().clear() - drops all cached queries in a collection
db.userInfo.getPlanCache().clearPlansByQuery(query[, projection, sort, collation]) - drops query shape from plan cache
db.userInfo.getPlanCache().getPlansByQuery(query[, projection, sort, collation]) - displays the cached plans for a query shape

通过相关命令,删除cache plan,mongo会自动生成新的cache plan

Mongo优化笔记的更多相关文章

  1. Android App性能优化笔记之一:性能优化是什么及为什么?

    By Long Luo   周星驰的电影<功夫>里面借火云邪神之口说出了一句至理名言:“天下武功,唯快不破”. 在移动互联网时代,同样如此,留给一个公司的窗口往往只有很短的时间,如何把握住 ...

  2. (转)MySQL优化笔记(八)--锁机制超详细解析(锁分类、事务并发、引擎并发控制)

    当一个系统访问量上来的时候,不只是数据库性能瓶颈问题了,数据库数据安全也会浮现,这时候合理使用数据库锁机制就显得异常重要了. 原文:http://www.jianshu.com/p/163c96983 ...

  3. U3D开发性能优化笔记(待增加版本.x)

    http://blog.csdn.net/kaitiren/article/details/45071997 此总结由自己经验及网上收集整理优化内容 包括: .代码方面: .函数使用方面: .ui注意 ...

  4. CMU Convex Optimization(凸优化)笔记1--凸集和凸函数

    CMU凸优化笔记--凸集和凸函数 结束了一段时间的学习任务,于是打算做个总结.主要内容都是基于CMU的Ryan Tibshirani开设的Convex Optimization课程做的笔记.这里只摘了 ...

  5. mongo 学习笔记

    mysql语句 : ' ,,),(,,)   mongo语句: db.}}).limit() db."}) db.}}) 条件操作符1 mongodb中的条件操作符有: (>) 大于 ...

  6. 移动web性能优化笔记

    移动web性能优化 最近看了一些文章,对移动web性能优化方法,做一个简单笔记 笔记内容主要出自 移动H5前端性能优化指南和移动前端系列——移动页面性能优化

  7. mysql系列十一、mysql优化笔记:表设计、sql优化、配置优化

    可以从这些方面进行优化: 数据库(表)设计合理 SQL语句优化 数据库配置优化 系统层.硬件层优化 数据库设计 关系数据库三范式 1NF:字段不可分; 2NF:有主键,非主键字段依赖主键; 3NF:非 ...

  8. nginx优化笔记(keepalive、https等)

    一.nginx之tcp_nopush.tcp_nodelay.sendfile 1.TCP_NODELAY你怎么可以强制 socket 在它的缓冲区里发送数据?一个解决方案是 TCP 堆栈的 TCP_ ...

  9. hibernate优化笔记(随时更新)

    一:优化配置 1.关联映射的配置:对照之前的博客,如:inverse属性的设置(减少对同一对象的多条update语句):在one端设置为true,只会执行一次update语句 2.级联cascade属 ...

随机推荐

  1. Bellman_ford 算法 Currency Exchange POJ1860

    Bellman_ford算法用于寻找正环或者负环! 算法导论: 24.1 The Bellman-Ford algorithm The Bellman-Ford algorithm solves th ...

  2. codevs——1462 素数和

    1462 素数和  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 青铜 Bronze 题解       题目描述 Description 给定2个整数a,b 求出它们之间(不含a ...

  3. Java实现打印功能-AWT Graphics2D

    Java实现打印功能 用java实现打印,java.awt中提供了一些打印的API,要实现打印,首先要获得打印对象,然后继承Printable实现接口方法print,以便打印机进行打印,最后用用Gra ...

  4. 递归删除目录下.svn文件

    原文:http://imysqldba.blog.51cto.com/1222376/1104901 ------------------------------------------------- ...

  5. 网络协议IPV6基础知识点集锦

    由于互联网的快速发展与普及,原有的IPV4地址已不能满足网络用户的需求,虽然NAT可以缓解IPV4地址的耗尽,但NAT破坏了网络环境的开放.透明以及端到端的特性,因此IPV6地址协议应运而生. IPV ...

  6. 双logo

    from aip import AipSpeech bd_k_l = ['11059852', '5Kk01GtG2fjCwpzEkwdn0mjw', 'bp6Wyx377Elq7RsCQZzTBgG ...

  7. Elasticsearch安装中文分词插件ik

    Elasticsearch默认提供的分词器,会把每一个汉字分开,而不是我们想要的依据关键词来分词.比如: curl -XPOST "http://localhost:9200/userinf ...

  8. Android连接热点的Socket文件传输

    最近把测试丢过来的种种BUG解决后,终于有时间去研究研究Socket通信,再加上以前做的WiFi连接和热点开启,于是有了现在的这篇博文:创建热点发送文件,让另一台手机连接热点接收文件. 效果图: 两台 ...

  9. 曼哈顿距离(坐标投影距离之和)d(i,j)=|X1-X2|+|Y1-Y2|.

    曼哈顿距离(坐标投影距离之和)d(i,j)=|X1-X2|+|Y1-Y2|. 我们可以定义曼哈顿距离的正式意义为L1-距离或城市区块距离,也就是在欧几里德空间的固定直角坐标系上两点所形成的线段对轴产生 ...

  10. php自动加载的两个函数__autoload和__sql_autoload_register

    一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.class.php //文件 <?php class P ...