深入理解RDBMS | 青训营笔记

97 阅读4分钟

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

事务ACID

  • 事务(Transaction):是由一组SQL语句组成的一个程序执行单元,需要满足ACID特性

ACID:

  • 原子性(Atomicity):事务是一个不可在分割的工作单元,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency):数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
  • 隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
  • 持久性(Durability):在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。 高并发: 高并发(High Concurrency)是指通过设计保证系统能够同时并行处理很多请求。高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。

高性能: 高性能是指程序处理速度非常快,所占内存少、CPU 占用率低。高性能的指标经常和高并发的指标紧密相关,想要提高性能,那么就要提高系统高并发能力,两者互相捆绑在一起.

高可靠/可用: 高可用性(High Reliability/Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性(一直都能用)。

RDBMS

一条SQL的一生

一个SQL语句从发出到执行一共经历了以下步骤

image.png

解析器: 解析器一般分为词法分析、语法分析和语义分析等步骤

image.png

词法分析:分析出来关键词、表列名、常量、运算符、结束符 语法分析:根据词法分析的结果,语法分析器会根据语法规则,判断输入的这个SQL语句是否满足MySQL语法 语义分析:对语句中的列名常量等判断是否合法

优化器: 经过了解析器,MySQL就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。 优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

执行器: MySQL通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。开始执行的时候,要先判断一下你对这个表有没有执行查询的权限,如果没有,就会返回没有权限的错误。如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

存储引擎 - InnoDB

image.png

InnoDB 是一个兼顾高可靠性和高性能的通用存储引擎。 InnoDB的主要优势:

  1. 其 DML 操作遵循 ACID 模型,具有提交、回滚和崩溃恢复功能的事务以保护用户数据。
  2. 行级锁定和 Oracle 风格的一致性读取提高了多用户并发性和性能。
  3. InnoDB 表在磁盘上排列数据以优化基于主键的查询。每个 InnoDB 表都有一个称为聚集索引的主键索引,用于组织数据以最小化主键查找的 I/O。
  4. 为了保持数据完整性,InnoDB 支持 FOREIGN KEY 约束。使用外键检查插入、更新和删除以确保它们不会导致相关表之间的不一致

事务引擎

Undo Log

Undo Log是逻辑日志,记录的是数据的怎量变化。利用Undo Log可以进行事务回滚,从而保证事务的原子性。同时也实现了多版本并发控制,解决了读写冲突和一致性读的问题,

Isolation 和 MVCC

MVCC的意义: - 读写互不阻塞 - 降低死锁概率 - 实现一致性读

Undo Log在MVCC中的作用:

1. 每个事务有一个单调递增的事务ID

2. 数据页的行记录中包括了DB_ROW_ID,DB_TRX_ID,DB_ROLL_PTR

3. DB_ROLL_PTR将数据行的所有快照记录都通过链表的结构串联了起来

持久化与Redo log

如何保证事务结束后,对数据的修改永久的保存? 方案一:事务提交前将页面写入磁盘 缺点:随机IO、写放大

方案二:WAL redolog是物理日志,记录的是页面的变化,他的作用是保证事务持久化。如果数据写入磁盘前发生故障,数据库重启后会根据redolog重做。