为什么要使用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,会造成很高的延迟(数分钟到数小时不等)
为什么要使用MongoDB?的更多相关文章
- 【翻译】MongoDB指南/聚合——聚合管道
		
[原文地址]https://docs.mongodb.com/manual/ 聚合 聚合操作处理数据记录并返回计算后的结果.聚合操作将多个文档分组,并能对已分组的数据执行一系列操作而返回单一结果.Mo ...
 - 【翻译】MongoDB指南/CRUD操作(四)
		
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...
 - 【翻译】MongoDB指南/CRUD操作(三)
		
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近 ...
 - 【翻译】MongoDB指南/CRUD操作(二)
		
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...
 - 【翻译】MongoDB指南/CRUD操作(一)
		
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删 ...
 - CRL快速开发框架系列教程十二(MongoDB支持)
		
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
 - MongoDB系列(二):C#应用
		
前言 上一篇文章<MongoDB系列(一):简介及安装>已经介绍了MongoDB以及其在window环境下的安装,这篇文章主要讲讲如何用C#来与MongoDB进行通讯.再次强调一下,我使用 ...
 - MongoDB系列(一):简介及安装
		
什么是MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为应用提供可扩展的高 ...
 - [原]分享一下我和MongoDB与Redis那些事
		
缘起:来自于我在近期一个项目上遇到的问题,在Segmentfault上发表了提问 知识背景: 对不是很熟悉MongoDB和Redis的同学做一下介绍. 1.MongoDB数组查询:MongoDB自带L ...
 - 用MongoDB分析合肥餐饮业
		
看了<从数据角度解析福州美食>后难免心痒,动了要分析合肥餐饮业的念头,因此特地写了Node.js爬虫爬取了合肥的大众点评数据.分析数据库我并没有采用MySQL而是用的MongoDB,是因为 ...
 
随机推荐
- 26.Set
			
1.Set集合 1.1Set集合概述和特点[应用] 可以去除重复 存取顺序不一致 没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除Set集合里面的元素 1.2Set集合的使 ...
 - MD5加密以及登录获取设置token
			
MD5简介 MD5是不可逆的加密算法,基本上是不可破解的,网上有些破解网站,其实是利用了穷举法,因为MD5生成的串是一样的,他们会将常规的密码生成MD5加密串,保存,然后破解的时候去穷举比对.(应对之 ...
 - [刷题] 79 Word Search
			
要求 给定一个二维平面的字母和一个单词,从一个字母出发,横向或纵向连接二维平面上的其他字母 同一位置的字母只能使用一次 示例 board = [ ['A','B','C','E'], ['S' ...
 - im-chooser重新选择输入法框架在终端执行im-chooser命令
			
CentOS 7安装图像桌面.Ibus拼音输入法一.图形桌面安装1.安装额外包yum源(extra package for Enterprise Linux) yum install epel-rel ...
 - linux 进程信号集合 sigset_t -(转自linengeir的专栏)
			
sigset_t 号集及信号集操作函数:信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来 ...
 - 7.1 useradd:创建用户
			
7.1 useradd:创建用户 1 使用useradd 常规添加用户工作原理流程 在使用useradd命令时,若不加任何参数选项,后面直接跟所添加的用户名,那么系统首先会读取/etc/log ...
 - JDK5.0新特性  (Day_07)
			
JDK5.0新特性 目录 静态导入 自动装箱/拆箱 for-each循环 可变参数 枚举 JDK 5.0 新特性简介 JDK 5.0 的一个重要主题就是通过新增一些特性来简化开发,这些特性包括 ...
 - 深入剖析 MySQL 自增锁
			
之前的文章把 InnoDB 中的所有的锁都介绍了一下,包括意向锁.记录锁...自增锁巴拉巴拉的.但是后面我自己回过头去看的时候发现,对自增锁的介绍居然才短短的一段. 其实自增锁(AUTO-INC Lo ...
 - Go语言网络通信---一个简单的UDP编程
			
Server端: package main import ( "fmt" "net" ) func main() { //创建udp地址 udpAddr, _ ...
 - Go基础结构与类型05---程序运算
			
package main import ( "fmt" "math" ) func main() { /*加减乘除,求余*/ fmt.Println(" ...