设为首页 收藏本站
查看: 1062|回复: 0

[经验分享] MongoDB实战经验分享

[复制链接]

尚未签到

发表于 2015-7-6 06:59:58 | 显示全部楼层 |阅读模式
  本文来自去年整理发布的“十天掌握MongoDB”系列PPT。该系列PPT的内容则来自当时的《MongoDB权威指南(英文版)》,个人翻译能力有限,不能保证PPT的内容完全符合该书的内容。而且,我还加入了大量的自己的看法。今天分享给大家的便是其中的第十课,主要是我个人当时的观点,这些观点在现在看来不一定都是正确的,请大家多多批评指正!
对NoSQL的理解
  NoSQL并不是No-SQL,而是指Not Only SQL。
  NoSQL的出现是为了弥补SQL数据库因为事务等机制带来的对海量数据、高并发请求的处理的性能上的欠缺。
  NoSQL不是为了替代SQL而出现的,它是一种替补方案,而不是解决方案的首选。
  绝大多数的NoSQL产品都是基于大内存和高性能随机读写的(比如具有更高性能的固态硬盘阵列),一般的小型企业在选择NoSQL时一定要慎重!不要为了NoSQL而NoSQL,可能会导致花了冤枉钱又耽搁了项目进程。
  NoSQL不是万能的,但在大型项目中,你往往需要它!
为什么是MongoDB?

  • 基于BSON,兼容JSON
  • 有广泛的驱动支持
  • 高性能、开源、面向文档
  • 全文索引支持
  • 自动复制分片
  • 内置分布式文件系统
  • 内置MapReduce支持
  • ……
  不要被老陈骗了,我只是想罗列一下MongoDB的优点,如果想了解其他NoSQL产品,不妨看看http://cloud.iyunv.com/a/20110610/299526.html
文档结构设计
  在SQL时代,我们可以任意设计自己的表结构,仅仅需要注意数据类型的选择,只是无法直接使用树形设计而已。
  在MongoDB就没这么幸运了,MongoDB内置的查询机制非常有限,它无法让"你的原来的设计"那么轻松的就能迁移过来。
  其实,MongoDB这样的"不给力",都是"故意"的!通过核心算法的约束,强迫开发者大量的使用冗余数据来提升计算效率。
  这个做法,好!也不好!好的是,的确可以解决很多问题,不好的是,因此我们需要改变之前一贯的思路,甚至是之前认为非常一般般的做法,还会给维护带来很多"看起来不必要"的麻烦。
  MongoDB宣称自己占用的处理器资源是很低的——其实是因为它的架构就直接绕开了很多运算!!!
  在这里我没有太多想说的,总结起来就一句话——不要吝啬存储空间,要将冗余数据的优点发挥到极致!
索引及查询优化
  传统的用于优化SQL的技巧,在MongoDB中同样适用;
  不要为所有键都创建索引,也不要一个索引也不用;
  如果需要,请优先考虑复合索引,但请注意键的顺序;
  如果发现即使创建索引也无法很有效的提升,此时应该考虑将数据分片;
  设计查询时,应当将能够过滤掉大量记录的条件放在前面,除非这样的改动影响了业务需求。
  无论什么业务,请尽量避免在数据库端处理各种排序,如果可以,请尽量减少这样的设计,以提升数据库服务器的吞吐量。老陈的经验是:用户其实并不讨厌多点几次鼠标,讨厌的是点了N多次鼠标之后,找不到合适的内容。试想一下,为什么baidu不提供用户主动排序的功能?
复制分片及副本集
  复制是指将数据完完整整的复制到其他MongoDB实例上;
  分片是将一块数据很多小块并分发到不同的集合或MongoDB实例;
  副本集带有故障转移的特性
  而实际上,在生产环境中,我们应当将如上三个概念混合使用,并发挥到极致。
  数据安全、运算效率以及负载分流、故障转移等等,每一个特性都需要做的很强壮!
  还记得前面说过的吗,NoSQL不是谁都可以玩的,也不是谁都可以玩好的!一个强壮的MongoDB集群可能需要至少十几台服务器,光硬件就是不小的投入!
  关于数据安全——不要迷信任何设备,应当经常备份重要的业务数据。
  是的,使用复制可以对MongoDB的数据执行热备份。而不需要停掉主数据库引擎。
其他
  尽量少用嵌套文档,它会让你的数据库膨胀的非常快,且不利于扩展;
  当然,我不是说不要用,如果没有对子文档的深层查询、排序,或者根本就是记录一下而已,这种情况用子文档是最爽不过了!
  MongoDB不适合存储高精度的数字,比如你需要精度非常高的财务数据存储,此时建议使用其他持久化方案,或者你干脆就存成字符串或者创建一个字符串格式的副本进行存储。
  MongoDB没有内联查询机制,全靠手工外键;
  MongoDB没有自增标识,未来的规划中也没有迹象表明要支持,实际上,这是MongoDB故意的!我们建议使用随机标识,而不是递增标识。
  标识,读作biaozhi4,而不是biaoshi2,记好了哈!
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83515-1-1.html 上篇帖子: mongodb学习(翻译1) 下篇帖子: asp.net mvc + mongodb 实践
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表