这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记。主要记录数据库课程上的一些重点内容及理解。
一.什么是RDBMS
RDBMS即关系数据库管理系统,是管理关系型数据库并将数据逻辑组织的系统。RDBMS以表集合的形式存储数据,并且可以在这些表的公共字段之间定义关系。现在常用的关系型数据库软件有MySQL、Oracle等。
二.什么是SQL
SQL即结构化查询语言,它是关系型数据库管理系统的标准语言,用于存取数据以及查询、更新和管理关系型数据库系统。
SQL是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。
结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。而且SQL语言语法简单,接近英语口语因此易于学习和使用。
三.一条SQL的一生
如图所示,一条SQL语句的执行依次经历Parser(解析器)、Optimizer(优化器)、Executor(执行器)、存储引擎。
Parser负责将要处理的SQL命令解析成结构化数据,也就是抽象语法树(AST)。首先做词法分析,分割文本为一个个的token,识别各个字符串分别代表什么,如语句类型、表名、列名、运算符、常量等。接下来做语法分析,将词法分析结果转为语法树,根据语法规则判断输入的SQL语句是否符合语法,输出一个结构化的数据结构。然后是语义分析,对语法树中信息进行合法性校验,判断表名、列名是否存在,类型是否合法等。
Optimizer根据AST基于代价最低方案优化产生最优执行计划(Plan Tree)。如多表连接时小表先进行连接等。
Executor:处理事务一致性、并发、读写隔离等,有火山模型、向量化、编译执行多种执行方式。
存储引擎:负责数据的存储和提取,包括内存中的数据缓冲区、数据文件、日志文件等。常用的存取引擎有InnoDB和MyISAM等。
四.事务ACID与其实现
1.原子性:一个事务要么全部完成,要么全部不完成,当执行出错会恢复到事务开始的状态
Undo Log是逻辑日志,记录的是数据的增量变化。通过Undo Log可以进行事务回滚,从而保证事务的原子性。同时提供多版本支持MVCC,接近读写冲突和一致性读的问题。
2.一致性:分为了数据库外部的一致性和内部的一致性。一致性是最基本的属性,其他的三个属性都为了保证一致性而存在。如果数据被改了一半(不满足A),互相干扰(I不满足),挂了后丢数据(D不满足),就无法保证一致性。
3.隔离性:允许多个并发事务同时对数据机械能读写和修改,防止多个事务并发执行时由于交叉执行导致的数据不一致。
针对多事务同时执行可能遇到的脏读、不可重复读和幻读等,需要根据事务不同的隔离级别(读未提交、读提交、可重复读和串行化)使用不同的锁。MVCC(并发版本控制机制)使得读写互不阻塞、降低死锁概率、实现一致性读。
4.持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
Redo Log是物理日志,记录的是页面的变化。MySQL采用Write-Ahead Logging:修改并不直接写入到数据库文件中而是写入到一个称为WAL的文件中;如果事务识别,WAL中的记录会被忽略撤销修改;如果事务成功它将在随后的某个时间被写回数据库文件中,提交修改。其核心是先写日志再写磁盘。有了Redo Log,就可以保证即使数据库发生异常重启之前提交的redo log记录不会丢失,可以根据redo log进行重做,保证事务持久化。