行如逆水行舟,不进则退
简述
MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库。它们各有各的优点,关键是看用在什么地方。所以我们所熟知的那些SQL语句就不适用于MongoDB了,因为SQL语句是关系型数据库的标准语言。由于本人前端出身,Node.js搭载MongoDB可以更快更好的搭建后台服务,本文主要以MongoDB来比对MySQL数据库的区别。
关系型数据库-MySQL
- 在不同的引擎上有不同的存储方式。
- 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。
- 开源数据库的份额在不断增加,mysql的份额也在持续增长。
- 缺点就是在海量数据处理的时候效率会显著变慢。
- 支持事物操作,遵循ACID原则
ACID原则
事务在英文中是transaction,和现实世界中的交易很类似。其中A / D 是基础,而 C / I 看业务场景。
A (Atomicity) 原子性:事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。 比如银行转账,从A账户转200元至B账户,分为两个步骤:1)从A账户取200元;2)存入200元至B账户。这两步要么一起完成,要么一起不完成,如果第一步成功,而第二步失败,钱会莫名其妙少了200元。
C (Consistency) 一致性:数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。 例如现有完整性约束a存款+b存款=2000,如果一个事务改变了a存款,那么必须得改变b存款,使得事务结束后依然满足a存款+b存款=2000,否则事务失败。
ACID 把 C 限制在一个事务单元内,强调事务必须保证数据从一个一致性状态进入另一个一致性状态,事务的结束和数据的一致性之间没有时差。与分布式系统的一致性并不是一个概念,主要是由于分布式系统写入和读取都可能不在同一台机器上,而这必然会有一段时间导致不同机器上所存的数据不一致的情况,这就是所谓的“不一致时间窗口”。
I (Isolation)隔离性:隔离性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。 比如现在有个交易是从A账户转200元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的200元的。(参照12306高并发网站,当别人预定车票后,查询车票时发生改变,否则不发生变化)。
D (Durability) 持久性:一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。
总结
事务所能体现出的作用就是通过其所具有的属性定义的,隔离性保证了数据库的并发访问中,多个事务之间彼此隔离,避免相互影响;原子性则保证了即使事务执行失败,仍然能够将数据库恢复到执行前状态;一致性则是在数据库操作执行异常时,维护健康的关系约束条件不被破坏掉。持久性则是保证数据的修改被记录到持久化设备上,不受系统异常或设备断电的影响。
非关系型数据库-MongoDB
非关系型数据库(nosql ),属于文档型数据库。先解释一下文档的数据库,即可以存放xml、json、bson类型系那个的数据。这些数据具备自述性,呈现分层的树状数据结构。数据结构由键值(key=>value)对组成。
- 存储方式:虚拟内存+持久化。
- 查询语句:是独特的MongoDB的查询方式。
- 适合场景:事件的记录,内容管理或者博客平台等等。
- 架构特点:可以通过副本集,以及分片(shard)来实现高可用。
- 数据处理:数据是存储在硬盘上的,只不过需要经常读取的数据会被加载到内存中,将数据存储在物理内存中,从而达到高速读写。
- 成熟度与广泛度:新兴数据库,成熟度较低,Nosql数据库中最为接近关系型数据库,比较完善的DB之一,适用人群不断在增长。
MongoDB优势与劣势
优势:
- Mongo的存储方式为虚拟内存+持久化存储,MongoDB将数据写入内存中,再由虚拟内存管理器将其持久化到硬盘中,因此读写操作会比关系型数据库快很多。
- MongoDB的高可用和集群架构拥有十分高的扩展性。
- 在副本集中,当主库遇到问题,无法继续提供服务的时候,副本集将选举一个新的主库继续提供服务。
- MongoDB的Bson和JSon格式的数据十分适合文档格式的存储与查询。
劣势:
- 不支持事务操作。MongoDB本身没有自带事务机制,若需要在MongoDB中实现事务机制,需通过一个额外的表,从逻辑上自行实现事务。
- 应用经验少,由于NoSQL兴起时间短,应用经验相比关系型数据库较少。
- MongoDB占用空间过大。
比对
| 数据库类型 | MongoDB | MySQL |
| 数据库模型 | 以类JSON的文档的格式存储 | 不同引擎有不同的存储方式 |
| 查询语句 | MongoDB查询方式(类似JavaScript的函数) | SQL语句 |
| 数据处理方式 | 基于内存,将热数据存放在物理内存中,从而达到高速读写 | 不同引擎有自己的特点 |
| 成熟度 | 新兴数据库,成熟度较低 | 成熟度高 |
| 广泛度 | NoSQL数据库中,比较完善且开源,使用人数在不断增长 | 开源数据库,市场份额不断增长 |
| 事务性 | 仅支持单文档事务操作,弱一致性 | 支持事务操作 |
| 占用空间 | 占用空间大 | 占用空间小 |
| join操作 | MongoDB没有join | MySQL支持join |