关系数据库管理系统 (Relational Database Management System:RDBMS) 是指包括相互联系的逻辑组织和存取这些数据的一套程序 (数据库管理系统软件)。
关系数据库管理系统就是管理关系数据库,并将数据逻辑组织起来的系统
一、模块划分
- 数据库最主要的功能就是存储我们的数据,因此它会有一个存储模块来存储我们的数据,存储模块就类似于我们的 OS 文件系统,将数据最终持久化存入磁盘中,如:机械硬盘、SSD 固态硬盘
- 可是光有存储是不行的,我们还需要组织并用到这些数据,因此我们需要有程序实例,用逻辑结构来映射物理结构,并且在程序中提供获取以及管理数据的方式,还有必要的问题追踪机制
- 程序实例又可以分为以下模块
- 存储管理
- 对数据的格式以及文件的风格进行统一的管理,即把物理数据通过逻辑的形式组织和表示出来
- PS:如何优化存储效能?
- 数据的处理不可能在磁盘上进行操作,而是将其加载到程序空间所在的内存里去操作,而磁盘 IO 速率往往是程序执行速度的主要瓶颈,因此为了执行效率,我们需要尽可能地减少 IO
- 一次 IO 读取一条数据和多条数据花费的时间,并没有多大区别,所以我们可以一次性地去读取多行数据,以提升 IO 性能
- 数据库会把逻辑存储单位以块或页来表示,每个块或页会存放多行数据,这样读取的时候,就可以将多个块或页一起加载到内存当中
- 缓存机制
- 将取出的数据块存放在缓存里,下次需要的时候直接从内存中返回,而不用进行 IO
- 需要补充的是,上面我们提到的一次性加载多个块或页,这些里面包含的数据有相当一部分不是我们本次查询所需要的,但是根据一旦某行数据被访问,其相邻的数据也极有可能被访问的经验,我们缓存的非本次数据也能起到优化访问效率的作用
- 另外,缓存不宜过大,且算法里要有淘汰机制,淘汰掉一些不常用的数据
- SQL 解析
- 将 SQL 编译解析,转换成机器可识别的指令
- PS:如何提升 SQL 执行效率?
- 将编译好的 SQL 放入缓存里,供下次使用的时候直接解析
- 日志管理
- 记录 SQL 操作,供数据库主从同步或灾难恢复使用
- 权限划分
- 提供用户管理数据的私密空间
- 容灾机制
- 除了考虑正常功能,还要考虑异常情况,如:数据库挂了怎么恢复?恢复到什么程度?
- 索引管理
- 进一步提升数据库的查询效率
- 锁管理
- 使数据库支持并发操作
二、相关拓展
- MySQL 中的日志管理实现是什么?
- binlog,即二进制格式的日志文件,它记录了所有的 DDL 和 DML 操作 (除了数据查询语句),以事件形式记录,还包含了语句执行所消耗的时间,
类别 | 含义 |
DML (data manipulation language) | 数据操作语言 例如:SELECT、UPDATE、INSERT、DELETE 相关的 SQL,主要用于操作数据库中的数据 |
DDL (data definition language) | 数据定义语言 例如:CREATE、ALTER、DROP,主要用于定义或改变表的结构、数据类型、表之间的链接和约束 |
DCL (data control language) | 数据控制语言 例如:GRANT、DENY、REVOKE,主要用于设置或更改数据库用户或角色的权限 |
- MySQL 的二进制日志是事务安全型的
- MySQL 中二进制日志 (binlog) 的使用场景?
- MySQL 主从复制
- MySQL 数据恢复
- 为什么要使用索引?
- 对数据进行查询,最简单的方式就是全表扫描,即将整张表的数据全部或分批次加载到内存中,然后对块或页进行轮询,直到找到目标数据再返回,这种方式普遍认为会比较慢,适用于数据量较小的情况,不适用于数据量较大的情况
- 因此很多情况下我们要避免全表扫描的发生,所以我们需要引入更加高效的机制 --> 索引,它的灵感来自于字典,在字典中只要把一些关键信息 (偏旁、部首等) 组织起来,就能很快查到我们想要查的字了,这些关键信息和查找的方式便组成了我们的索引,通过索引可以大幅度提升查询效率
三、归纳总结
- 如何设计一个关系型数据库?
- 要设计一个关系型数据库,首先要将其划分为两大部分,一个是存储部分,该部分类似于一个文件系统,用于将数据持久化到存储设备中;另一个是程序实例部分,用于对数据进行逻辑上的管理
- 程序实例部分又包含将数据的逻辑关系转换成物理存储关系的存储管理模块;优化执行效率的缓存机制模块;对 SQL 语句进行解析的 SQL 解析模块;记录操作的日志管理模块;进行多用户管理的权限划分模块;异常恢复的容灾机制模块;优化数据查询效率的索引管理模块;使数据库支持并发操作的锁管理模块
- 关系型数据库示意图