TiDB架构中核心的SQL执行流程(重要)

课程名称:课程版本(101)Lesson 05 TiDB 数据库 SQL 执行流程

学习时长:40分钟

课程收获:

本节课是【TiDB 数据库架构】章节最后一课,可以说该课程的内容是对前期4节课内容的串联和融合。虽然本节课只有对DML和DDL这2个执行流程的讲解,但更是对之前单个功能点、结构的统一梳理和管理;这使得之前的内容不再零散、孤立。PS:该课程的内容也是PTCA考试中点关照的地方之一。^~^

课程内容:

1、DML语句读流程


1)Protocol Layer:接受客户端发送来的SQL语句。
2)PD Client:不管是读还是写,都要先到PD节点获取唯一的时间戳TSO(是物理时间戳+逻辑时间戳的组合),用于标识语句\事务的开始执行时间(ps:向PD请求TSO是一个异步获取的过程,往往解析和编译前发起请求;且返回的是不是TSO,而是tsfuture函数)。
3)Parse:对SQL进行词法也语法解析,解析成AST语法树。
4)Compile:对AST语法树进行点查还是非点查的区分;对非点查生成执行计划;点查则走KV模块了。
4.1>preprocess:预处理阶段,检测SQL的合法性、名称是否正确、绑定信息等;然后判断是否为点查。如果是点查,则走Complie和PointGet路线直接获取数据;如果不是点查,则进入optimize优化流程。
4.2>optimize:优化流程分2类,一是逻辑优化,对SQL进行逻辑变换(如外连接转内连接),二物理优化,结合逻辑优化结果和统计信息(表的行数、列的选择性)选择最优的算子(生成了执行计划)。
5)Execute:结合KV或DistSQL某块执行SQL
5.1>DistSQL:对非点查改写成对单表的范围查询然,然后根据执行计划由它向TiKV Clinet发送信息获取数据。
5.2>KV:对于通过主键、唯一索引进行的等值查询,由它发送给TiKV Clinet。
6)TiKV Client:不管是KV还是DistSQL都要通过TiKV CLient来完成从TiKV中获取数据。期间,TiKV会先查看自己的Region Cache中是否有目标region的信息,如果有则用;否则调用PD Client向PD获取目标region的信息。
7)UnifyRead Pool:TiKV层的它对不管是点查还是非点查,都会发到这个线程池;然后按优先级进行执行。执行时,到RocksDB KV中获取数据,数据查找顺序是先到TiKV的block cache 再到 memtable 再到物理层的SST文件,一层层的往下找。
8)有结果后,按原路径UnifyRead Pool–>TIKV CLinet–>KV/DistSQL–>Execute–>Protocol Layer–>客户端,返回结果。

2、DML语句写流程


PS:写流程和读流程在数据加载到内存中的流程是相同的。
1)Protocol Layer:接受客户端发送来的SQL语句。
2)PD Client:向PD节点获取唯一的时间戳TSO,用于标识语句\事务的开始执行时间。
3)Parse:对SQL进行词法也语法解析,解析成AST语法树。
4)Compile:完成预处理、逻辑优化、物理优化;对AST语法树进行点查还是非点查的区分;对非点查生成执行计划,走DistSQL某块;点查则走KV模块。
5)Execute:执行数据的获取,点查则经KV进行数据获取;如果非点查则通过Dist SQL模块依据执行计划获取数据
6)TiKV Client:接收来着KV或DistSQL发送的获取数据请求,与到TIKV交互获取数据。
7)RocksDB KV:通过TiKV Clinet接收数据查找请求,并将结果数据通过路径:UnifyRead Pool–>TIKV CLinet–>KV/DistSQL–>Execute–>memBuffer
8)memBuffer:将读出的数据放入memBuffer中,然后对缓存中的数据加锁、进行修改(写操作);
9)数据修改完成后,客户端发出commit指令,此时数据库进入2阶段提交
Prewrite阶段:
10)Transaction:将数据修改信息和锁信息写入TiKV,发送相关信息给TiKV Client由其和TiKV进行持久化信息信息交互。
12)Scheduler:接受TiKV Client转发的来自Transaction的写数据和锁信息(已经转换成了KV形式的数据)请求;由它负责协调事务并发写入的冲突;
13)Raftstore:将写请求转换为raft log。然后一边分发到本地的rocksdb raft进行持久化,另一边发送给其他节点的副本,进行raft log同步。当大多数follower返回日志已经持久化完成后,那该条数据就不会丢失了;此时,客户返回给客户端命令的执行结果了。
Commited阶段
11> Transaction:向PD获取到结束时的TSO。
12>按2阶段提交流程,将TSO、提交信息写到rocksKV并清理掉锁信息。

3、DDL流程


1)Protocol Layer:接受客户端发送来的SQL语句。
2)Parse:对SQL进行词法也语法解析,解析成AST语法树。
3)Compile:完成预处理、逻辑优化、物理优化;生成执行计划。
4)start job:接受编译后的DDL语句,首先查看自己所在TiDB Server的Workers是否为owner角色,如果是则直接执行DDL语句;否则,将语句封装成DDL任务通过TiKV Client发送给TiKV让其写入对应的队列中:
job queue:存放除添加索引的DDL外的其他DDL语句;
add index queue:存放添加索引的DLL语句
history queue:执行后的DDL放入历史队列
5)workers:只有owner角色的TiDB Server的Workers才负责执行DDL的job;workers取出TIKV队列中的DDL进行执行,执行完成后将job放入history queue.

学习过程中遇到的问题或延伸思考:

  • 问题 1:在TIDB Server接到客户端发来的DDL语句,是否也首先会获取一个TSO?

学习过程中参考的其他资料