深入理解RDBMS课程笔记 | 青训营笔记

138 阅读5分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记。

本节课围绕关系型数据库(RDBMS)进行展开。关系型数据库是后端开发过程中必不可缺的一个工具,在数据库的持久化和对数据的增删改查中起到了非常重要的作用。

1.事务ACID

ACID是关系型数据库的一个基本的特性,ACID即为:

  • 原子性(Atomicity):事务是一个不可分割的工作单元,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency):数据库事务不能破坏关系型数据的完整性以及业务逻辑上的一致性。
  • 隔离性(Isolation):多个事务的并发访问时,事务之间是隔离的,一个事务不应该影响其他事务运行效果。
  • 持久性(Durability):在事务完成之后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会回滚。

对于一致性而言,我认为还是比较难理解的,重点在于数据库在操作前后“状态”应该是保持不变的,所谓“状态”具体是什么,其实是比较灵活的,比如在银行转账过程中,有转入和转出两个操作,将这两个看成一个事务的话,状态就应该是整个数据库中的总钱数,这个状态应该是保持不变的。

2.DBMS发展历史

DBMS发展过程经历了网状模型层次模型关系模型

三种模型的对比如下(来自字节青训营):

1653654583(1).png

3.RDBMS的关键技术

SQL语言是一门针对数据库的结构化查询语言,非常符合人类的语言习惯。但是对于机器而言,其首先需要经过解析的步骤才能让机器识别,再经过优化器进行优化,最后送入执行器执行最终的逻辑(包括读取数据以及操作数据)。

解析(Parse)一般分为词法分析,语法分析,语义分析等步骤。

所谓词法分析,其实就是从命令语句中首先识别出事先定义好的关键字,经过关键字的识别后,就能从待执行命令中抽象出语法树(语法树其实可以理解成底层实现中的一种类型,能够让底层语言更好的了解需要执行的目标对象),语义分析是对其中的语法树进行检查,看是否合法。

对于优化器(Optimizer)的作用,其实可以理解成导航的路径选择,通过之前解析的环节,导航了解了目的地并对其合法性进行了验证,于是接下来就会推荐出达到目的的最优方案。 优化器在平时写sql时还是经常会接触到的,比如我们经常会遇到的某一条查询语言走不走索引以及走了哪些索引,其实这些说到底即使优化器的选择结果。

执行引擎(Executor)负责执行优化器优化后的命令。

存储引擎负责存储,每个数据库都有着自己独特的存储引擎,mysql的InnoDB存储引擎架构主要如下:

1653656437(1).png 大部分存储引擎都有基于内存和基于磁盘的两部分,内存主要是为了能够更快的操作数据,磁盘用于存储一些重要的数据信息,比如元数据信息和一些日志等。InnoDB缓存中数据的淘汰机制是基于LRU的优化版,讲LRU分为了两个区域(类似于垃圾回收中的年代分化)。

存储引擎是已为单位进行存储的,而数据则是“页”中一条一条的数据。一行记录的格式如下:

1653657098(1).png 变长字段用于记录哪些字段是变长的,NULL值标志用于记录哪些字段是为空的,Header则标志数据是否被删除,下一条数据在哪。row_id是数据的主键id(只有当数据没有主键的时候,才会默认该列为主键),roll_ptx是上一个版本的数据的指针,用于事务的回滚操作。 数据行是存放在页中的,在查找的时候会首先在页中利用二分查找查找到对应的槽,在按照顺序查找找到具体的某一条数据。

Mysql中的数据回滚是利用Undo log日志实现的。利用undo log可以进行事务回滚,以及实现MVCC功能。 MVCC的意义是为了读写不阻塞,降低死锁概率,实现一致性读的功能。

4.总结与思考

本节课介绍的RDBMS是实际开发中经常使用到的一个工具,介绍了RDBMS的发展经历以及其中一些核心的技术。

在实际使用过程中,RDBMS能够解决了几乎所有数据存储问题。但是数据库还是存在一定性能瓶颈的,在实际中可能还要需要考虑到分库分表,分库即把不同种类的数据拆分到不同数据库;分表则是讲业务数据的水平拆分,即把数据存储到不同的服务器(可能按照ID存储或者地点存放)。同时还要考虑到动态扩容(为了解决突增的流量访问)。