一、MySql
1)Mysql介绍
MySQL是关系型数据库:
- MySQL也是一种硬盘型数据库,它所有的数据都是存放在硬盘中,需要使用的时候才会交换到内存中。因此MySQL能够处理海量的数据,但是数据量很大的时,速度会稍慢。
- MySQL的使用需要提前建表,不适用于数据结构变换频繁的情况。
非关系型数据库:MongoDB、Redis
二、MongoDB
1)MongoDB介绍
MongoDB是一个基于分布式文件存储的开源数据库系统,MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。MongoDB的数据索引是B-树。
- MongoDB 在创建数据库的时候,会直接在磁盘上面分配一组数据文件,所有的集合、索引和数据库的其他元数据都保存在这些文件中。
- MongoDB 的所有数据实际上是存放在硬盘的,所有要操作的数据通过 mmap 的方式映射到内存某个区域内。然后,MongoDB 就在这块区域里面进行数据修改,避免了零碎的硬盘操作。至于 mmap上的内容flush到硬盘就是操作系统的事情了,所以,如果,MongoDB 在内存中修改了数据后,mmap 数据flush到硬盘之前,系统宕机了,数据就会丢失。
2)MongoDB的特点
优点:
- 提供面向文档存储,操作简单
- 扩展性强,第三方支持丰富
- 具有failover机制(失效转移:一种备份操作模式,当一个系统因为一些故障无法完成工作的时候,另一个系统自动接替已失效系统的工作继续执行)
- 支持大容量存储,内置GridFS(可用于存放大量的小文件)
- 在高负载的情况下,可以添加更多的节点,保证服务器性能
缺点:
- 无事务机制(数据库事务(database transaction)对单个的逻辑单元执行一系列的操作,要么完全执行,要么完全不执行)
- 占用空间过大
- 没有mysql那样成熟的维护工具
- MongoDB 对数据之间事务关系支持比较弱,如果业务这一方面要求比较高的话,MongoDB 还是并不适合此类型的应用
适用场景:
- 适合那种数据格式不明确
或者经常变化的模型,比如事件记录、内容管理或者博客平台。
三、Redis
1)Redis介绍
Redis是一种内存数据库,所有的数据都是放在内存之中,定期写入磁盘中,当内存不够的时候,可选择指定的LRU算法删除数据。Redis是基于哈希字典建立的,因此其索引方式是哈希。
特点:
- 由于数据存放在内存中,因此读写性能高
- 支持丰富的数据类型,如键值对、集合、列表、散列存储
集群:
MongoDB 集群技术比较成熟,Redis从3.0开始支持集群。
Mongo和Redis之间的性能比较:
数据量和性能:
当物理内存够用的时候,redis>mongodb>mysql
当物理内存不够用的时候,redis和mongodb都会使用虚拟内存。
实际上如果redis要开始虚拟内存,那很明显要么加内存条,要么你换个数据库了。
但是,mongodb不一样,只要,业务上能保证,冷热数据的读写比,使得热数据在物理内存中,mmap的交换较少。
mongodb还是能够保证性能。有人使用mongodb存储了上T的数据。
mysql,mysql根本就不需要担心数据量跟内存下的关系。不过,内存的量跟热数据的关系会极大地影响性能表现。
当物理内存和虚拟内存都不够用的时候,估计除了mysql你没什么好选择了。
其实,从数据存储原理来看,我更倾向于将mongodb归类为硬盘数据库,但是使用了mmap作为加速的手段而已。