MongoDB开发最佳实践

  1. 连接到MongoDB · 关于驱动程序:总是选择与所用之MongoDB相兼容的驱动程序。这可以很容易地从驱动兼容对照表中查到;

     · 如果使用第三方框架(如Spring Data),则还需要考虑框架版本与驱动的兼容性;

    · 关于连接对象MongoClient:使用MongoClient对象连接到MongoDB实例时总是应该保证它单例,并且在这个生命周期 中都从它获取其他操作对象。

    · 关于连接字符串:连接字符串中可以配置大部分连接选项,建议总是在连接字符串中配置这些选项;

    // 连接到复制集 mongodb://节点1,节点2,节点3.../database?[options]

    // 连接到分片集 mongodb://mongos1,mongos2,mongos3.../database?[options]

  2. 常见连接字符串参数 · maxPoolSize

     · 连接池大小

    · maxWaitTime

     · 建议设置,自动杀掉太慢的查询

    · writeConcern

     · 建议majority保证数据安全

    · readConcern

     · 对于数据一致性要求高的场景适当使用
  3. 连接字符串节点和地址 · 无论对于复制集或分片集,连接字符串中都应尽可能多地提供节点地址,建议全部列出;

     · 复制集利用这些地址可以更有效地发现集群成员;
    
     · 分片集利用这些地址可以更有效的分散负载;

    · 连接字符串中尽可能使用与复制集内部配置相同的域名或IP;

  4. 使用域名连接集群 在配置集群时使用域名可以为集群变更时提供一层额外的保护。例如要将集群整体迁移到新网段,直接修改域名解析即可。

    另外,MongoDB提供的mongoDB+srv://协议可以提供额外一层保护。该协议允许通过域名解析得到所有mongos或节点的地址, 而不是写在连接字符串中。

    mongodb+srv://server.example.com/

    Record TTL Class Priority Weight Port Target _mongodb._tcp.server.example.com.86400

    IN SRV 0 5 27317 mongodb1.example.com._mongodb._tcp.server.example.86400 IN SRV 0 5 27017 mongodb2.example.com.

  5. 不要在mongos前面使用负载均衡 基于前面提到的原因,驱动已经直销在不同的mongos之间实现负载均衡,而复制集则需要根据节点的角色来选择发送请求的目标。 如果在mongos或复制集上层部署负载均衡:

    · 驱动会无法探测具体那个节点存活,从而无法完成自动故障恢复;

    · 驱动会无法判断游标是在哪个节点创建的,从而遍历游标时出错;

    结论:不要在mongos或复制集上层放置负载均衡器,让驱动处理负载均衡和自动故障恢复。

  6. 游标使用 如果一个游标已经遍历完,则自动关闭;如果没有遍历完,则需要手动调用close()方法,否则该游标将在服务器上存在 10分钟(默认值)后超时释放,造成不必要的资源浪费。

    但是,如果不能遍历完一个游标,通常意味着查询条件太宽泛,更应该考虑的问题是如何将条件收紧。

  7. 关于查询及索引 · 每一个查询都必须要有对应的索引

    · 尽量使用覆盖索引Covered indexes(可以避免读数据文件)

    · 使用projection来减少返回客户端的文档内容

  8. 关于写入 · 在update语句里只包括需要更新的字段

    · 尽可能使用批量插入语句来提升写入性能

    · 使用TTL自动过期日志类型的数据

  9. 关于文档结构 · 防止使用太长的字段名(浪费空间)

    · 防止使用太深的数组嵌套(超过2层操作比较负责)

    · 不使用中文,标点符号等非拉丁字母作为字段名

  10. 处理分页问题-避免使用count 尽可能不要计算总页数,特别是数据量大和查询条件不能完整命中索引时。

    考虑以下场景:假设集合总共有1000W条数据,在没有索引的情况下考虑以下查询:

    db.coll.find({x:100}).limit(50);
    db.coll.count({x:100});

    · 前者只需要遍历前n条,直到找到50条队伍 x = 100 的文档即可结束;

    · 后者需要遍历完1000W条所有符合要求的文档才能得到结果。

    为了计算总页数而进行count()往往是拖慢页面真题加载速度的原因。

  11. 处理分页问题——巧分页 避免使用skip/limit形式的分页,特别是数据量大的时候;

    替代方案:使用条件查询+唯一条件排序;

    例如:

    第一页:db.find({}).sort({_id: 1}).limit(20);

    第二页:db.find({_id:{$gt:<第一页最后一个_id>}}).sort({_id: 1}).limit(20);

    第三页:db.find({_id:{$gt:<第二页最后一个_id>}}).sort({_id: 1}).limit(20);

    ······

  12. 关于事务 使用事务的原则:

    · 无论何时,事务的使用总是能避免则避免;

    · 模型设计先于事务,尽可能用模型设计规避事务;

    · 不要使用过大的事务(尽量控制在1000个文档更新以内);

    · 当必须使用事务时,尽可能让涉及事务的文档分布在同一片上,这将有效地提高效率;

MongoDB开发最佳实践的更多相关文章

  1. web前端开发最佳实践笔记

    一.文章开篇 由于最近也比较忙,一方面是忙着公司的事情,另外一方面也是忙着看书和学习,所以没有时间来和大家一起分享知识,现在好了,终于回归博客园的大家庭了,今天我打算来分享一下关于<web前端开 ...

  2. [转]Android开发最佳实践

    ——欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢—— 原文链接:https://github.com/futurice/and ...

  3. Hadoop MapReduce开发最佳实践(上篇)

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  4. 【读书笔记】iOS-微信公众平台开发最佳实践

    一,微信是由腾讯公司广州研发中心产品团队开发,该团队经理张小龙被称为“微信之父”,公司总裁马化腾确定该产品名称为“微信”. 二,常见问题及解决方案. 1,请求URL超时. 这种情况一般是由于服务器网速 ...

  5. Android开发最佳实践《IT蓝豹》

    Android开发最佳实践   移动开发Android经验分享应用GoogleMaterial Design 摘要:前 段时间,Google公布了Android开发最佳实践的一系列课程,涉及到一些平时 ...

  6. Android和PHP开发最佳实践

    Android和PHP开发最佳实践 <Android和PHP开发最佳实践>基本信息作者: 黄隽实丛书名: 移动应用开发技术丛书出版社:机械工业出版社ISBN:9787111410508上架 ...

  7. iOS应用开发最佳实践

    <iOS应用开发最佳实践> 基本信息 作者: 王浩    出版社:电子工业出版社 ISBN:9787121207679 上架时间:2013-7-22 出版日期:2013 年8月 开本:16 ...

  8. 【社区公益】送《Web前端开发最佳实践》给需要的人

    算起来至今,我进入软件开发行业已经有11年之久.从最初的研究人工智能,到后来的Web开发,控件开发,直到现在纯粹的Web前端开发.虽然没有大的作品问世,但也是勤勤恳恳,踏实做事,低调做人.从来不吹牛逼 ...

  9. Web前端开发最佳实践系列文章汇总

    Web前端开发最佳实践(1):前端开发概述 Web前端开发最佳实践(2):前端代码重构 Web前端开发最佳实践(3):前端代码和资源的压缩与合并 Web前端开发最佳实践(4):在页面中添加必要的met ...

随机推荐

  1. Oracle trunc和round的区别

    1.关于trunc 和round函数比较 整体概括: round函数 四舍五入trunc函数 直接截取 对于时间: Round函数对日期进行"四舍五入",Trunc函数对日期进行截 ...

  2. SpringBoot+MybatisPlus实现批量添加的两种方式

    第一种: 因为Mysql数据每次发送sql语句的长度不能超过1M,所以,每次发送insert语句以固定长度发送: 将sql语句在provider中,以固定长度装入List集合中,然后返回service ...

  3. 【C/C++】最长公共子序列(LCS)/动态规划

    晴神这个的最巧妙之处,在于用dp[i][0] = dp[0][j] = 0的边界条件 这样从1的下标开始填数组的时候,递推公式dp[i-1][j-1]之类的不会报错 #include <iost ...

  4. C语言static关键字

    C语言static关键字 static关键字的作用,主要从在程序的生存周期.作用域和在代码段中的位置起作用. 全局变量 静态全局变量 局部变量 静态局部量 生存周期 程序运行到结束 程序运行到结束 函 ...

  5. Linux centos7 安装.net 环境

    其实在linux 下安装.net 环境并不复杂,但最近遇到的服务器没有外网,比较坑很多依赖都没有,记录下这次的安装过程. 一开始以为是服务器没有外网,后来发现是服务器没有配置dns,于是配置dns 第 ...

  6. ICCV2021 | 简单有效的长尾视觉识别新方案:蒸馏自监督(SSD)

    ​  前言  本文提出了一种概念上简单但特别有效的长尾视觉识别的多阶段训练方案,称为蒸馏自监督(Self Supervision to Distillation, SSD).在三个长尾识别基准:Ima ...

  7. mysql深度优化与理解(迄今为止读到最优秀的mysql博客)

    转载:https://www.cnblogs.com/shenzikun1314/p/6396105.html 本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如 ...

  8. Samba 源码解析之SMBclient命令流

    smbclient提供了类似FTP式的共享文件操作功能, 本篇从源码角度讲解smbclient的实现,smbclient命令的具体使用可通过help命令和互联网查到大量资料. 以下从源码角度分析一个s ...

  9. logcplus(2)

    (一)log4cplus是C++编写的开源的日志系统,功能非常全面,用到自己开发的工程中会比较专业的,:),本文介绍了log4cplus基本概念,以及如何安装,配置.  ### 简介 ### log4 ...

  10. HSPICE与非门仿真

    一.HSPICE的基本操作过程 打开HSPICE程序,通过OPEN打开编写好的网表文件. 按下SIMULATE进行网表文件的仿真. 按下AVANWAVES查看波形图(仿真结果). 二. 网表文件结构总 ...