这是我参与「第五届青训营」伴学笔记创作活动的第 13 天。
-
SQL语言:结构化查询语言,语法风格接近自然语言,高度非过程化,面向集合的操作方式,语言简洁,易学易用
-
SQL执行流程:数据库接收到SQL后,Parser模块解析SQL语句,生成语法树AST,Optimizer优化器根据语法树生成Plan(树状结构),executor执行plan,从文件中读取数据,返回数据,写入数据等,返回结果到用户。
-
SQL引擎
-
Parser:解析器,一般分为词法分析 (Lexical analysis )、语法分析 ( Syntax analysis )、语义分析 ( Semantic analyzer ) 等步骤.
-
optimizer:优化器判断那种执行方式是最优的方式
-
基于规则的优化(RBO, Rule Base Optimizer)
-
基于代价的优化(CBO,Cost Base Optimizer):一个查询有多种执行方案,CBO会选择其中代价最低的方案去真正的执行。代价,时间
-
-
Executor
-
火山模型 :逐层向下调用,数据逐层向上返回
-
向量化模型:适合大批量数据处理,对于很多单行数据处理没有优势。往往搭配列式存储使用
-
simd机制:一条CPU指令里可以计算多条数据
-
-
编译执行:把所有逻辑代码写入一个函数里,就没有函数调用了。把不同算子合在一个函数里,动态编译技术,拿到plan后动态生成代码编译路径
-
-
-
存储引擎—InnoDB
-
分为两部分,内存In-Memory和磁盘On-Disk
-
In-Memory:
- Buffer Pool:用作数据缓存
- Change Buffer
- Adaptive Hash Index
- Log Buffer:写日志先写到这个buffer,再写到磁盘上
-
On-Disk:
-
System Tablespace(ibdata1):系统表,存元数据,表名列名属性等
-
General Tablespaces(xxx.ibd):表中存有什么数据
-
Undo Tablespaces(xxxibu):存日志
-
Temporary Tablespaces(xxx.ibt)
-
Redo Log(ib_logfileN):存日志
-
-
Buffer Pool:
-
每个chunk的大小一般为128M,每个block对应一个page,一个chunk下有8192个block。这样可以避免内存碎片化。分成多个instance,可以有效避免并发冲突。page id % instance num得到它属于那个insatnce
-
两个重要结构:hashmap,通过page id找到block。LRU,管理内存空间,把最近最常使用的保存在内存
-
-
Page:Innodb会把内存分成一个个16k的内存空间,在磁盘上存储是按page存储的
-
B+ Tree:构建索引
-
-
事务引擎
-
原子性:undo log用来将数据库回退到修改之前的状态
- Undo Log是逻辑日志,记录的是数据的增量变化。利用Undo Log可以进行事务回滚,从而保证事务的原子性。同时也实现了多版本并发控制( MVCC )解决读写冲突和一致性读的问题。
-
一致性:业务上实现
-
隔离性:锁,MVCC
-
持久性:redo log
-
-
总结
学习了SQL语句的执行流程,SQL引擎,存储引擎和事务引擎的组成和原理。