数据库的全方位整理:mysql,mariaDB,Percona Server,MongoDB,Redis,RocksDB
👀 数据库分类
数据库分类对比
| 英文名 | 中文名 | 定义 | 存储方式 | ACID规则支持情况 | CAP原理支持情况 |
|---|---|---|---|---|---|
| Relational database | 关系型数据库 | 采用了关系模型来组织数据的数据库 | 表格 | 支持ACID规则 | 满足CP,但A不完美 |
| NoSQL | 非关系型数据库 | 泛指非关系型的数据库,不保证关系数据的ACID特性 | 键值存储、列存储、文档存储等 | 不一定完全支持ACID规则 | 满足AP,但C不完美 |
| NewSQL | NewSQL | NewSQL是对各种新的可扩展/高性能数据库的简称 | 多种存储方式 | 支持ACID规则 | 满足CAP |
ACID规则
- 原子性(A) 一个事务的所有系列操作步骤被看成一个动作,所有的步骤要么全部完成,要么一个也不会完成。如果在事务过程中发生错误,则会回滚到事务开始前的状态,将要被改变的数据库记录不会被改变。
- 一致性(C) 一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏,即数据库事务不能破坏关系数据的完整性及业务逻辑上的一致性。
- 隔离性(I) 主要用于实现并发控制,隔离能够确保并发执行的事务按顺序一个接一个地执行。通过隔离,一个未完成事务不会影响另外一个未完成事务。
- 持久性(D) 一旦一个事务被提交,它应该持久保存,不会因为与其他操作冲突而取消这个事务。
CAP原理
- Consistency(一致性): 数据一致更新,所有数据变动都是同步的
- Availability(可用性): 好的响应性能
- Partition tolerance(分区耐受性): 可靠性
举例来说在高可用的网站架构中,对于数据基础提出了以下的要求:
- 分区耐受性 保证数据可持久存储,在各种情况下都不会出现数据丢失的问题。为了实现数据的持久性,不但需要在写入的时候保证数据能够持久存储,还需要能够将数据备份一个或多个副本,存放在不同的物理设备上,防止某个存储设备发生故障时,数据不会丢失。
- 数据一致性 在数据有多份副本的情况下,如果网络、服务器、软件出现了故障,会导致部分副本写入失败。这就造成了多个副本之间的数据不一致,数据内容冲突。
- 数据可用性 多个副本分别存储于不同的物理设备的情况下,如果某个设备损坏,就需要从另一个数据存储设备上访问数据。如果这个过程不能很快完成,或者在完成的过程中需要停止终端用户访问数据,那么在切换存储设备的这段时间内,数据就是不可访问的。
🦩 关系型数据库
关系型数据库,是指采用了关系模型来组织数据的数据库
- 关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
- 通过SQL结构化查询语句存储数据。
- 强调ACID规则, 保持数据一致性。
🦈 MySQL
| 知识体系 | 存储引擎 | 面试题 | 优化与集群架构 | 源码与配置参数 | 视频资源 | 文章 | Paper | 电子书籍 | 常见问题 |
|---|---|---|---|---|---|---|---|---|---|
| 🌴 | 🔱 | ⭕ | 🛠 | 📜 | 🧿 | 📄 | 🍀 | 📙 | 🧲 |
🌴 知识体系
MySQL体系详解
MySQL体系详解
MySQL架构图
MySQL架构图
MySQL亿级订单数据分库分表设计架构图
MySQL亿级订单数据分库分表设计架构图(鑫语人间)
MySQL亿级流量系统设计每秒十万查询的高并发架构图
MySQL亿级流量系统设计每秒十万查询的高并发架构图(石杉)
🔱 存储引擎
- MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。
- InnoDB引擎使用B+Tree作为索引结构,叶节点保存了完整的数据记录(数据和索引)。
- B+树原理详解
MyISAM引擎
MyISAM索引实现
- MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。
这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:
同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。 MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。
MyISAM引擎特点
- 不支持事务
- 表级锁定 数据更新时锁定整个表:其锁定机制是表级锁定,也就是对表中的一个数据进行操作都会将这个表锁定,其他人不能操作这个表,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能。
- 读写互相阻塞 不仅会在写入的时候阻塞读取,MyISAM还会再读取的时候阻塞写入,但读本身并不会阻塞另外的读。
- 只会缓存索引 MyISAM可以通过key_buffer_size的值来提高缓存索引,以大大提高访问性能减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据。
- 读取速度较快 占用资源相对较少
- 不支持外键约束,但只是全文索引
- MyISAM引擎是MySQL5.5版本之前的默认引擎,是对最初的ISAM引擎优化的产物。
MyISAM引擎适用的生产业务场景
- 不需要事务支持的业务(例如转账就不行,充值也不行)
- 一般为读数据比较多的应用,读写都频繁场景不适合,读多或者写多的都适合。
- 读写并发访问都相对较低的业务(纯读纯写高并发也可以)(锁定机制问题)
- 数据修改相对较少的业务(阻塞问题)
- 以读为主的业务,例如:blog,图片信息数据库,用户数据库,商品库等业务
- 对数据一致性要求不是很高的业务。
- 中小型的网站部分业务会用。
- 小结:单一对数据库的操作都可以示用MyISAM,所谓单一就是尽量纯读,或纯写(insert,update,delete)等。
MyISAM引擎调优精要
- 设置合适的索引(缓存机制)(where、join后面的列建立索引,重复值比较少的建索引等)
- 调整读写优先级,根据实际需求确保重要操作更优先执行,读写的时候可以通过参数设置优先级。
- 启用延迟插入改善大批量写入性能(降低写入频率,尽可能多条数据一次性写入)。
- 尽量顺序操作让insert数据都写入到尾部,较少阻塞。
- 分解大的操作,降低单个操作的阻塞时间,就像操作系统控制cpu分片一样。
- 降低并发数(减少对MySQL访问),某些高并发场景通过应用进行排队队列机制Q队列。
- 对于相对静态(更改不频繁)的数据库数据,充分利用Query Cache(可以通过配置文件配置)或memcached缓存服务可以极大的提高访问频率。
- MyISAM的Count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问。
InnoDB引擎
InnoDB索引实现
- InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。叶节点保存了完整的数据记录(数据和索引)。
InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。例如,下图为定义在Col3上的一个辅助索引:
这里以英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
InnoDB引擎适用的生产业务场景
- 支持事务
- 行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成。
- 数据更新较为频繁的场景,如:BBS(论坛)、SNS(社交平台)、微博等
- 数据一致性要求较高的业务,例如:充值转账,***转账。
- 硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘IO,可以通过一些参数来设置
- 相比MyISAM引擎,Innodb引擎更消耗资源,速度没有MyISAM引擎快
InnoDB引擎调优精要
- 主键尽可能小,避免给Secondery index带来过大的空间负担。
- 避免全表扫描,因为会使用表锁。
- 尽可能缓存所有的索引和数据,提高响应速度,较少磁盘IO消耗。
- 在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交,有开关可以控制提交方式。
- 合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性。 如果innodb_flush_log_at_trx_commit的值为0,log buffer每秒就会被刷写日志文件到磁盘,提交事务的时候不做任何操作。
- 避免主键更新,因为这会带来大量的数据移动。
其他引擎
⭕ 面试题
🛠 优化与集群架构
📜 源码与配置参数
- MySQL5.7源码地址: dev.mysql.com/get/Downloa…
- MySQL8.0源码地址: cdn.mysql.com//Downloads/…
- MySQL源码文件结构及主要数据结构
- MySQL5.7配置文件
- MySQL8.0配置文件
🧿 视频资源
📄 文章
📙 电子书籍
🍀 Paper
⚒ 集群架构
后续添加...
🧲 常见问题
🐬 MariaDB
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。
在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。
MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM存储引擎。
MariaDB直到5.5版本,均依照MySQL的版本。
MariaDB项目
MariaDB与MySQL比较
MariaDB第三方工具
- DBEdit 一个免费的MariaDB数据库和其他数据库管理应用程序。
- Navicat 一系列Windows、Mac OS X、Linux下专有数据库管理应用程序。
- HeidiSQL 一个Windows上自由和开放源码的MySQL客户端。它支持MariaDB的5.2.7版本和以后的版本。[5][6]
- phpMyAdmin 一个基于网络的MySQL数据库管理应用程序
🐋 Percona Server
Percona Server项目
Percona Server由领先的MySQL咨询公司Percona发布。
Percona Server是一款独立的数据库产品,其可以完全与MySQL兼容,可以在不更改代码的情况了下将存储引擎更换成XtraDB。是最接近官方MySQL Enterprise发行版的版本。
Percona提供了高性能XtraDB引擎,还提供PXC高可用解决方案,并且附带了percona-toolkit等DBA管理工具箱。
Percona Server 只包含 MySQL 的服务器版,并没有提供相应对 MySQL 的 Connector 和 GUI 工具进行改进。
Percona Server 使用了一些 google-mysql-tools, Proven Scaling, Open Query 对 MySQL 进行改造。
MySQL,MariaDB,Percona Server如何选择
综合多年使用经验和性能对比,首选Percona分支,其次是MariaDB,如果你不想冒一点风险,那就选择MYSQL官方版本。
🦉 NoSQL数据库
键值(Key-Value)存储数据库
- 相关产品: Redis、RocksDB
- 典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
- 数据模型: 一系列键值对
- 优势: 快速查询
- 劣势: 存储的数据缺少结构化
🐝 Redis
| 知识体系 | 数据类型 | 面试题 | 优化与集群架构 | 源码与配置参数 | 视频资源 | 文章 | Paper | 电子书籍 | 常见问题 |
|---|---|---|---|---|---|---|---|---|---|
| 🌴 | ♨ | ⭕ | 🛠 | 📜 | 🧿 | 📄 | 🍀 | 📙 | 🧲 |
🌴 知识体系
Redis知识体系图
Redis知识体系图
Redis Cluster方案图
官方Redis Cluster 方案(服务端路由查询)
Redis集群方案(单副本)
Redis集群方案(单副本)
♨ 数据类型
Redis的五大数据类型也称五大数据对象;Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject;
这个对象系统包含了五大数据对象,字符串对象(string)、列表对象(list)、哈希对象(hash)、集合(set)对象和有序集合对象(zset);
而这五大对象的底层数据编码可以用命令OBJECT ENCODING来进行查看。
//redisObjecttypedef struct redisObject {
// 类型属性存储的是对象的类型,也就是我们说的 string、list、hash、set、zset中的一种, //可以使用命令 TYPE key 来查看。
unsigned type:4;
// 编码,记录了队形所使用的编码,即这个对象底层使用哪种数据结构实现。
unsigned encoding:4;
// 指向底层实现数据结构的指针
void *ptr;
// ...
} robj;
redis是以键值对存储数据的,所以对象又分为键对象和值对象,即存储一个key-value键值对会创建两个对象,键对象和值对象。键对象总是一个字符串对象,而值对象可以是五大对象中的任意一种。
⭕ 面试题
🛠 优化与集群架构
Redis集群方式
📜 源码与配置参数
🧿 视频资源
📄 文章
后续补充...
🍀 Paper
📙 电子书籍
🧲 常见问题
🦗 RocksDB
RocksDB特点:
RocksDB是嵌入式持久化存储系统,它是一个单点高性能的存储DB,不是分布式存储系统。 RocksDB能支持非常高吞吐量的IO读写,可以作为大型分布式存储系统元数据的存储媒介,比如Hadoop Ozone就将其元数据使用RocksDB作为元数据的结果写出。
-
高性能: RocksDB使用一套日志结构的数据库引擎,为了更好的性能,这套引擎是用C++编写的。 Key和value是任意大小的字节流。
-
为快速存储而优化: RocksDB为快速而又低延迟的存储设备(例如闪存或者高速硬盘)而特殊优化处理。 RocksDB将最大限度的发挥闪存和RAM的高度率读写性能。
-
可适配性: RocksDB适合于多种不同工作量类型。 从像MyRocks这样的数据存储引擎, 到应用数据缓存, 甚至是一些嵌入式工作量,RocksDB都可以从容面对这些不同的数据工作量需求。
-
基础和高级的数据库操作: RocksDB提供了一些基础的操作,例如打开和关闭数据库。 对于合并和压缩过滤等高级操作,也提供了读写支持。
RocksDB的典型场景(低延时访问):
- 需要存储用户的查阅历史记录和网站用户的应用
- 需要快速访问数据的垃圾检测应用
- 需要实时scan数据集的图搜索query
- 需要实时请求Hadoop的应用
- 支持大量写和删除操作的消息队列
🌴 知识体系
RocksDB5大子模块,分别为:
- Basic Operation,基本操作定义
- Terminology,内部术语定义
- Tool,内部工具
- Logging/Monitoring ,日志和监控
- System Behavior,内部系统行为