青训营学习记录day12 | 青训营笔记

60 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第12天,开始的开始除了准备学习相关的知识,还要规划好每天的日程。

昨天记录了RDBMS基本情况介绍今天来记录下RDBMS关键技术分析。

SQL引擎需要做查询解析、查询解析、查询执行以及存储引擎。

查询解析:SQL语言接近自然语言,入门容易。但是各种关键字、操作符组合起来,可以表达丰富的语意。因此想要处理SQL命令,首先将文本解析成结构化数据,也就是抽象语法树(AST)。

查询解析:SQL是一门表意的语言,只是说『要做什么』,而不说『怎么做』。所以需要一些复杂的逻辑选择『如何拿数据』,也就是选择一个好的查询计划。优化器的作用根据AST优化产生最优执行计划(Plan Tree)。

查询执行:根据查询计划,完成数据读取、处理、写入等操作。事务引擎:处理事务一致性、并发、读写隔离等

存储引擎:内存中的数据缓存区、数据文件、日志文件。

所有的代码在执行之前,都存在一个解析编译的过程,差异点无非在于是静态解析编译还是动态的。

SQL语言也类似,在SQL查询执行前的第一步就是查询解析。

词法分析:将一条SQL语句对应的字符串分割为一个个token,这些token可以简单分类。

语法分析:把词法分析的结果转为语法树。根据tocken序列匹配不同的语法规则,比如这里匹配的是update语法规则,类似的还有insert、delete、select、create、drop等等语法规则。根据语法规则匹配SQL语句中的关键字,最终输出一个结构化的数据结构。

语义分析:对语法树中的信息进行合法性校验。

事务的ACID是怎么实现的呢?

原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。需要记录数据修改前的状态,一边在事务失败时进行回滚。undo log是逻辑日志,记录的是数据的增量变化,它的作用是保证事务的原子性和事务并发控制。可以用于事务回滚,以及提供多版本机制(MVCC),解决读写冲突和一致性读的问题。

Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。 如果多个并发事务访问同一行记录,就需要锁机制来保证了。读写是否冲突?读写互不阻塞,MVCC机制。

持久化:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。WAL:修改并不直接写入到数据库文件中,而是写入到另外一个称为WAL的文件中;如果事务失败,WAL中的记录会被忽略,撤销修改;如果事务成功,它将在随后的某个时间被写回到数据库 文件中,提交修改。这样做的优点是只记录增量变化,没有写放大 Append only,没有随机IO。