前言: MongoDB最流行的现代数据库,内存级的读写.MongoDB这个来源英文单词“humongous”,homongous这个单词的意思是“巨大的”、“奇大无比的”,从MongoDB单词本身可以看出它的目标是提供海量数据的存储以及管理能力。
什么是MongoDB
MongoDB是由MongoDB,Inc。开发的非关系数据库.MongoDB将数据作为文档存储在名为BSON(二进制JSON)的二进制表示中。相关信息存储在一起,以便通过MongoDB查询语言进行快速查询访问。字段因文档而异; 没有必要向系统声明文档结构 - 文档是自我描述的。如果需要将新字段添加到文档中,则可以在不影响集合中的所有其他文档的情况下创建该字段,而无需更新中央系统目录,也不会使系统脱机。(可选)模式验证可用于对每个集合强制执行数据治理控制。
MongoDB的文档数据模型自然地映射到应用程序代码中的对象,使开发人员可以轻松学习和使用。文档使您能够轻松地表示层次关系以存储数组和其他更复杂的结构。
我们为什么要使用mongoDB
因为它使他们能够更快地构建应用程序,处理高度多样化的数据类型,并大规模地管理应用程序。
由于MongoDB文档自然地映射到现代的面向对象编程语言,因此简化了开发。使用MongoDB删除了复杂的对象关系映射(ORM)层,该层将代码中的对象转换为关系表。MongoDB灵活的数据模型还意味着数据库模型可以随业务需求而发展。
MongoDB还可以在多个分布式数据中心内和跨多个分布式数据中心进行扩展,从而提供以前无法通过MySQL等关系数据库实现的新级别的可用性和可伸缩性。随着您的部署在数据量和吞吐量方面的增长,MongoDB可以轻松扩展,无需停机,也无需更改应用程序。相比之下,使用MySQL实现扩展通常需要大量的定制工程工作。
1. 存储方式
MongoDB它在数据存储的形态上和MySQL之类关系数据库有本质区别,MongoDB存储的基本对象是Document,所以我们把它称为一种文档数据库.而文档的集合是Collection.与SQL的概念类比,Collection对应于Table而Document对应于Row.Document使用一种BSON(Binary JSON)结构来表达,类似JSON的结构.
Document 在内部是如何存储的?每个Document被保存在一个Record 中。 Record 相当于 MongoDB 内部分配的一块空间,除了保存 Document 的内容可能还会预留一些填充的额外空间。对于写入后的 Document 如果还会更新,可能导致Document长度增加,就可以利用上额外的填充空间来。若业务对于写入后的Document不会再更新或删除(像监控日志、流水记录等),可以指定无填充的 Record 分配策略,更节省空间。
2. 效率
Mongo的存储方式为虚拟内存+持久化存储,Mongo将数据写入内存中,再由虚拟内存管理器将其持久化到硬盘中,因此写操作会比关系型数据库快很多.而且MongoDB 允许在服务端执行脚本,可以用 Javascript 编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
3. 高扩展
mongoDB存储的数据不需要具体的格式,它非常容易扩展,在使用Mysql开发时,最初设计table是让人头疼的,为了考虑到以后的扩展,不得不在table的后面预留一些Row,让人恶心是吧.但是mongoDB文档数据库的特点就是想存什么存什么,后期想添加数据也就是一行代码的事,给了我们极大的自由,当然自由肯定也是有后果的,后面会说.
4. 内置 Sharding
分片(Sharding) 帮助扩展,加速查询响应的时间,减少宕机的影响
缺点
1. 占空间
MongoDB 有一个最大的缺点,就是它占用的空间很大,因为它属于典型空间换时间原则的类型。那么它的磁盘空间比普通数据库会浪费一些,而且到目前为止它还没有实现在线压缩功能,在 MongoDB 中频繁的进行数据增删改时,如果记录变了,例如数据大小发生了变化,这时候容易产生一些数据碎片,出现碎片引发的结果,一个是索引会出现性能问题。
2. MongoDB 对数据间的事务关系支持比较弱
mongoDB在4.0版本之后也支持ACID,MongoDB将在4.2里推出分片集群的多文档事务支持。随着事务支持的增加,MongoDB功能上更接近于关系型数据库,但是和关系型还是有本质上的区别:关系数据库是基于关系模型的,其固定化的数据模型严格死板,对新一代应用迭代式开发支持不好,对各种数据多变的场景如物联网或社交化都无法支持的很好。MongoDB的JSON模型则具有动态灵活,数据库无须下线就可以进行模式变迁升级,特别适用于敏捷式的开发环境。
MongoDB的应用场景
数据不是特别重要(例如通知,推送这些),数据表结构变化较为频繁,数据量特别大,数据的并发性特别高,数据结构比较特别(例如地图的位置坐标),这些情况下用MongoDB,其他情况就还是用 MySQL,这样组合使用就可以达到最大的效率。
从目前阿里云 MongoDB 云数据库上的用户看,MongoDB 的应用已经渗透到各个领域,比如游戏、物流、电商、内容管理、社交、物联网、视频直播等,以下是几个实际的应用案例。
- 游戏场景,使用MongoDB存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新
- 物流场景,使用MongoDB存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
- 社交场景,使用MongoDB存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能
- 物联网场景,使用MongoDB存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析
- 视频直播,使用 MongoDB 存储用户信息、礼物信息等
......