TiDB是如何新建一张表的?


声明:本文转载自https://my.oschina.net/OnlyBlog/blog/2906871,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

TiDB是一个开源分布式数据库,并使用Rust编写的TiKV存储数据,其中TiDB是一个SQL语法解析层,本文使用MockDB模拟本地存储数据,从语法解析到实际存储操作进行分析一张数据表是如何建出来的。
过程如下:

  1. 首先我们得有一个建表语句
CREATE TABLE Persons
(
    Id_P int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    PRIMARY KEY (Id_P)
)
  1. TiDB拿到一个SQL语句之后,首先需要使用Parser进行语法解析
    上图中的代码为Parser的goyacc语法,最终SQL在Parser中走了一圈之后生成CreateTableStmt的结构,该结构具体的属性如下图所示:
  2. 在语法解析完成之后,就需要生一个抽象语法树AST,TiDB使用火山模型向下钻取生成语法树。 !
  3. 如果语法树生成的没有问题,接下来就要build一个LogicPlan,当然在build之前我们先进行一些预检查:
    预检查主要包括一些表名合法性检查,列名合法性检查,约束检查,主键检查等。
  4. 在确保AST检查无误之后,我们开始处理步骤3中生成的AST语法树。其中在ddl_api.go中我们再做更详细的检查,并最终生成一个TableInfo的结构,这个结构中保存了所有表相关的信息。并提交一个类型为Type: model.ActionCreateTable 的Job。
  5. 在ddl_worker.go接收到步骤5中的Job之后真正开始作为一个原子操作处理保存TableInfo的任务。其中t.CreateTable(schemaID, tbInfo) 将会真正调用Hash接口的API将TableInfo序列化之后存入后端存储中。
    在存储完成之后调用job.FinishTableJob通过前端建表语句已经执行完成。

总结: 目前看起来TiDB的代码结构相当清晰,由于并未使用任何MySQL客户端的C语言代码,所以代码也相当整洁,稍微花一些时间就能够了解到他是如何实现相关数据库操作的。

本文发表于2018年11月22日 11:00
(c)注:本文转载自https://my.oschina.net/OnlyBlog/blog/2906871,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 713 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

行业标准总是平庸的

一直到现在我才突然明白,我梦寐以求,是真爱和自由。

把爱情留给我身边最真心的姑娘,你陪我歌唱陪我流浪,陪我两败俱伤。

把青春献给身后那座辉煌的都市,为了这个美梦,我们付出着代价。

又是一年五一,祝我们工人阶级劳动节快乐! 今年被困在北京了,离境再入境需要隔离十五天。只能京津冀周边走一走了,想出去玩啊啊啊啊啊~

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1