为什么要使用MongoDB?
1.Mongo与Mysql简单对比
关系型数据库-MySQL
1.在不同的引擎上有不同的存储方式。
2.查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。
3.开源数据库的份额在不断增加,mysql的份额页在持续增长。
4.缺点就是在海量数据处理的时候效率会显著变慢。
非关系型数据库-MongoDB
非关系型数据库(nosql ),属于文档型数据库。先解释一下文档的数据库,即可以存放xml、json、bson类型系那个的数据。这些数据具备自述性,呈现分层的树状数据结构。数据结构由键值(key=>value)对组成。
1.存储方式:虚拟内存+持久化。
2.查询语句:是独特的MongoDB的查询方式。
3.适合场景:事件的记录,内容管理或者博客平台等等。
4.架构特点:可以通过副本集,以及分片来实现高可用。
5.数据处理:数据是存储在硬盘上的,只不过需要经常读取的数据会被加载到内存中,将数据存储在物理内存中,从而达到高速读写。
6.成熟度与广泛度:新兴数据库,成熟度较低,Nosql数据库中最为接近关系型数据库,比较完善的DB之一,适用人群不断在增长。
关于MongoDB与MySQL的区别可以参考网上关于NoSQL与MySQL的区别
|
Mongodb |
Mysql |
数据库模型 |
非关系型 |
关系型 |
存储方式 |
虚拟内存+持久化 |
不同的引擎有不同的存储方式 |
查询语句 |
独特的Mongodb查询方式 |
传统sql语句 |
架构特点 |
可以通过副本集,以及分片来实现高可用 |
常见有单点,M-S,MHA,MMM,Cluster等架构那个是发挥 |
数据处理方式 |
基于内存,将热数据存在物理内存中,从而达到高速读写 |
不同引擎拥有其自己的特点 |
成熟度 |
还行 |
拥有较为成熟的体系,成熟度较高 |
广泛度 |
nosql中比较完善的db之一,使用人群不断增长 |
开源数据库的份额在不断增加,mysql的份额也在持续增长 |
Join操作 |
MongoDB没有join |
支持join |
2.MongoDB的优势与劣势
优势
1.速度快!在适量级的内存的MongoDB的性能是非常迅速的,它将热数据存储在物理内存中,使得热数据的读写变得十分快。
2.MongoDB的高可用和集群架构拥有十分高的扩展性。
3.自身的Failover机制!在副本集中,当主库遇到问题,无法继续提供服务的时候,副本集将选举一个新的主库继续提供服务。
4.MongoDB的Bson和JSon格式的数据十分适合文档格式的存储与查询。
劣势
1.不支持事务操作。MongoDB本身没有自带事务机制,若需要在MongoDB中实现事务机制,需通过一个额外的表,从逻辑上自行实现事务。(4.0以后增加了事务)
2.应用经验少,由于NoSQL兴起时间短,应用经验相比关系型数据库较少。
3.MongoDB占用空间过大。
总体上讲,由于MongoDB独特的数据处理方式,可以将热点数据加载到内存,故而对查询来讲,会非常快(当然也会非常消耗内存);同时由于采用了BSON的方式存储数据,故而对JSON格式数据具有非常好的支持性以及友好的表结构修改性,文档式的存储方式,数据友好可见;数据库的分片集群负载具有非常好的扩展性以及非常不错的自动故障转移(大赞)。
不足:数据库的查询采用了特有的查询方式,有一定的学习成本(不高);索引不咋滴;锁只能提供到collection级别,还做不到行级锁;没有事务机制;学习资料肯定没有MySQL的多。
3.不适合MongoDB的场景
如果业务中存在大量复杂的事务逻辑操作,则不要用MongoDB数据库
4.MongoDB能解决的问题
一般来讲,我会将MySQL中的部分表迁移到MongoDB中,主要是涉及到车辆历史轨迹以及温湿度数据等机器采集到的数据,而订单数据、客户数据等信息,仍然放到MySQL数据库中,主要是因为这两类数据实时采集,实时更新,会随着时间的推移,项目的扩大(PAAS服务),造成非常巨大的数据量,而一般MySQL在单表数据量超过500万后,性能就会下降的比较快,虽然可以通过分表的方式进行处理,但是随着时间的增长,仍然会给我带来比较大的麻烦(如查询等),这样,就不如将其放到MongoDB中存储,查询什么的都会比较方便,不过需要注意根据片键分片。
5.MongoDB与Hadoop的区别
MongoDB侧重于对数据进行操作的应用系统,而Hadoop则侧重于对数据进行分析统计的应用。
MongoDB能够满足对数据库读写性能具有极高要求的应用场景(很消耗memory的),一般这些应用的响应延迟会要求控制在10ms以下,甚至更低。而Hadoop由于每一次的读写操作会包含大量数据(Hadoop更适合少次操作大批量数据的场景),通过聚集分析处理大量数据,这种分析一般都会走MapReduce,会造成很高的延迟(数分钟到数小时不等)