SQL执行流程
6.1读取流程概要
用户发出SQL,用potocol layer接收,parse,compile,execute,到rocksdb kv中,将需要修改的内容读出来,放在tidb server的membuffer中,当用户发出commit命令后,进入transaction进行两阶段提交(prewrite)(二阶段提交的commit),全部结束后,到pd节点读取结束的tso(读的时候需要开始的tso,写的时候需要开始和结束的tso)
2.DDL流程概要
用户发出DDL语句后,tidbserver中的start job,会将其放到tikv中的job 队列,job队列有3种:job queue,add index queue,和history queue。由tidb server中的owner的workers模块来进行处理job,处理完后将其清除队列并放入history queue中。
owner并不是一直不变的,会定期进行选举,产生新的owner
3.SQL的Parse与Compile
客户端发出sql,由tidb server protocol layer监听到客户端发来的sql,对sql文本进行处理,先从pd client从pd处获取开始的tso(读写都要),然后进行parse和compile模块进行解析,parse模块使用词法分析和语法分析,转换成AST语法树,这个语法树被传到compile模块。compile模块首先预处理,检测这条sql的语法性以及名称是否正确以及绑定信息的准确。如果是点查直接就执行,如果不是点查,就会进行optimize(逻辑优化/物理优化),物理优化根据逻辑优化,再根据统计信息,高效的取到数据。最后用物理执行计划到tikv中取数据。
4.读取的执行
收到执行计划后,execute需要获取表名这些元数据信息,information schema已经有记录了,可以从tidb server的缓存中读取。
这时候还要了解这个表所在的region以及tikv节点问题,这个时候只有pd有,pd和tidb server是有网络连通的,有负载,这时候我们第一次读取数据时,就会将其缓存在tikv client中的region cache中,以便后面使用。这时候如果发生变化后,会过期会再次到pd中去获取。
当tidb server获取了需要的表元数据信息和region的元数据信息后,接下来就是到tikv中去获取数据了。
KV对付的是点查
distsql应对的是复杂sql,distsql会将其复杂的sql语句转换成各个单表的查询,最后将结果集合并处理。获得简单的sql后发送给tikv获取结果。
tikv接收到请求后,会生成一个快照对象snapshot(特定时间点的结构),不论是点查还是复杂查询都会进入Unifyread pool中按优先级执行查询,到rocksdb kv中获取数据。
数据发回到tidb servevr中的tikv client后,(这里包含算子下推)
5.写入的执行
写入的执行,需要将修改的数据先读到membuffer中,之前跟读没区别。
transaction进入两段式提交,第一个阶段prewrite,第二个阶段是committed
transaction会从头遍历membuffer中的数据,数据是按序存放的,就按序执行。
在事务开始时获得tso,结束也要tso
我们的kv模块负责transaction读取之后,用kv去操作key值,通过tikv client发送到tikv中。
当请求发送给tikv client后,就需要到tik中去执行了,scheduler和raftstore,写请求发到scheduler当收到并发请求是并发写入时,这时就引入了latch去锁定,让谁先写。没有冲突的就进入到raftstore,将写请求转化成raft log,持久化到本地,并向其他tikv节点发送,同步操作。apply顺序读取这些raft log应用到rocksdb中。
6.DDL的执行
支持online ddl,ddl语句不锁表,增删改查不会被堵塞
协议,解析,编译后,start job负责接受DDL语句,start job接受到执行计划后,由owner的workers来进行执行。
shemaload:worker是确定是owner了,schema load将最新的元数据信息载入到tidb server中。