关系型数据库,NoSQL 数据库,NewSQL 数据库权威整理
12 种数据库的全方位整理:mysql,mariaDB,Percona Server,MongoDB,Redis,RocksDB,TiDB,CouchDB,Cassandra,TokuDB,MemDB,Oceanbase
👀 数据库分类
数据库分类对比
ACID 规则
原子性(A) 一个事务的所有系列操作步骤被看成一个动作,所有的步骤要么全部完成,要么一个也不会完成。如果在事务过程中发生错误,则会回滚到事务开始前的状态,将要被改变的数据库记录不会被改变。
一致性(C) 一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏,即数据库事务不能破坏关系数据的完整性及业务逻辑上的一致性。
隔离性(I) 主要用于实现并发控制,隔离能够确保并发执行的事务按顺序一个接一个地执行。通过隔离,一个未完成事务不会影响另外一个未完成事务。
持久性(D) 一旦一个事务被提交,它应该持久保存,不会因为与其他操作冲突而取消这个事务。
CAP 原理
Consistency(一致性): 数据一致更新,所有数据变动都是同步的
Availability(可用性): 好的响应性能
Partition tolerance(分区耐受性): 可靠性
举例来说在高可用的网站架构中,对于数据基础提出了以下的要求:
分区耐受性 保证数据可持久存储,在各种情况下都不会出现数据丢失的问题。为了实现数据的持久性,不但需要在写入的时候保证数据能够持久存储,还需要能够将数据备份一个或多个副本,存放在不同的物理设备上,防止某个存储设备发生故障时,数据不会丢失。
数据一致性 在数据有多份副本的情况下,如果网络、服务器、软件出现了故障,会导致部分副本写入失败。这就造成了多个副本之间的数据不一致,数据内容冲突。
数据可用性 多个副本分别存储于不同的物理设备的情况下,如果某个设备损坏,就需要从另一个数据存储设备上访问数据。如果这个过程不能很快完成,或者在完成的过程中需要停止终端用户访问数据,那么在切换存储设备的这段时间内,数据就是不可访问的。
🦩 关系型数据库
关系型数据库,是指采用了关系模型来组织数据的数据库
关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
通过 SQL 结构化查询语句存储数据。
强调 ACID 规则, 保持数据一致性。
🦈 MySQL
🌴 知识体系
MySQL 体系详解
MySQL 体系详解
MySQL 架构图
MySQL 架构图
MySQL 亿级订单数据分库分表设计架构图
MySQL 亿级订单数据分库分表设计架构图(鑫语人间)
MySQL 亿级流量系统设计每秒十万查询的高并发架构图
MySQL 亿级流量系统设计每秒十万查询的高并发架构图(石杉)
🔱 存储引擎
MyISAM 引擎使用 B+Tree 作为索引结构,叶节点的 data 域存放的是数据记录的地址。
InnoDB 引擎使用 B+Tree 作为索引结构,叶节点保存了完整的数据记录(数据和索引)。
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 源码地址: https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.18.tar.gz
MySQL8.0 源码地址: https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.19.tar.gz
🧿 视频资源
📄 文章
📙 电子书籍
🍀 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
🌴 知识体系
Redis 知识体系图
Redis 知识体系图
Redis Cluster 方案图
官方 Redis Cluster 方案(服务端路由查询)
Redis 集群方案(单副本)
Redis 集群方案(单副本)
♨ 数据类型
Redis 的五大数据类型也称五大数据对象;Redis 并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统 redisObject;这个对象系统包含了五大数据对象,字符串对象(string)、列表对象(list)、哈希对象(hash)、集合(set)对象和有序集合对象(zset);而这五大对象的底层数据编码可以用命令 OBJECT ENCODING 来进行查看。
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,内部系统行为
列存储数据库
相关产品:Cassandra, HBase
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
🦕 Cassandra
Cassandra 是开源分布式 NoSQL 数据库系统。用于储存收件箱等简单格式数据,集 GoogleBigTable 的数据模型与 Amazon Dynamo 的完全分布式的架构于一身,由于 Cassandra 良好的可扩展性,现在成为了一种流行的分布式结构化数据存储方案。是一个网络社交云计算方面理想的数据库。
特征
分布式
基于 column 的结构化
高伸展性
文档型数据库
相关产品:CouchDB、MongoDB、SequoiaDB
典型应用:Web 应用(与 Key-Value 类似,Value 是结构化的)
数据模型: 一系列键值对
优势:数据结构要求不严格
劣势: 查询性能不高,而且缺乏统一的查询语法
🦜 CouchDB
后续更新...
🦢 MongoDb
后续更新...
🦊 NewSQL 数据库
SQL 引擎
🦅 TokuDB
后续更新...
分布式数据库
🐪 TiDB
后续更新...
🐫 Oceanbase
后续更新...
🐐 MemDB
后续更新...
版权声明: 本文为 InfoQ 作者【hanaper】的原创文章。
原文链接:【http://xie.infoq.cn/article/8610a671caef843ecfbf37f96】。文章转载请联系作者。
评论