深入理解RDBMS(续)(day14)| 青训营笔记

51 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第14天

image.png

本文基于字节青训营+上网自学的内容。

3.关键技术——SQL引擎

1.Parser

所有的代码在执行之前,都存在一个解析编译的过程,SQL语句也不例外,差异点无非在于是静态解析编译还是动态的。
流程:词法分析(将代码拆成一个个token,有关键字、运算符等)、语法分析(根据语法规则,构建语法树)、语义分析(检查操作合法性)。

2.Optimizer(优化器)

为何需要优化器?
使用不同的方案的代价不同,要根据具体情况进行选择。
1.基于规则的优化(eg:条件化简、小表先进行连接。通过定义规则来进行优化。)
2.基于代价的优化(感知到代价(例如查询时间)自动选择其中代价最小的方案去执行。)

3.Executor

向量化->编译执行
向量化:每个Operator每次操作计算的不再是一行数据,而是一批数据(Batch N行数据),计算完成后向上层算子返回一个Batch。
优点:
函数调用次数降低为1/N;CPU cache命中率更高;
可以利用CPU提供的SIMD(Single Instruction Multi Data)机制。
编译执行:
将所有的操作封装到一个函数里面,函数调用的代价也能大幅度降低。
新问题!!!
用户SQL千变万化怎么办?难道要穷举用户的所有SQL,给每一个SQL都预先写好一个执行函数吗?

image.png

LLVM动态编译执行技术,根据优化器产生的计划,动态的生成执行代码。

4.存储引擎——InnoDB

InnoDB 是 MySQL 上第一个提供外键约束的数据存储引擎,除了提供事务处理外,InnoDB 还支持行锁,提供和 Oracle 一样的一致性的不加锁读取,能增加并发读的用户数量并提高性能,不会增加锁的数量。InnoDB 的设计目标是处理大容量数据时最大化性能,它的 CPU 利用率是其他所有基于磁盘的关系数据库引擎中最有效率的。

5.事务引擎

通过Undo_Log保持原子性:Undo Log是逻辑日志,记录的是数据的增量变化。利用Undo Log可以进行事务回滚,从而保证事务的原子性。同时也实现了多版本并发控制(MVCC) ,解决读写冲突和一致性读的问题。
锁与隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。如果多个并发事务访问同一行记录,就需要锁机制来保证了。(读写的冲突由MVCC机制来控制,参考此链接)
ReDo_Log与持久性:redo log是物理日志,记录的是页面的变化,它的作用是保证事务持久化。如果数据写入磁盘前发生故障,重启MySQL后会根据redo log重做。