TiDB是如何新建一张表的?
TiDB是一个开源分布式数据库,并使用Rust编写的TiKV存储数据,其中TiDB是一个SQL语法解析层,本文使用MockDB模拟本地存储数据,从语法解析到实际存储操作进行分析一张数据表是如何建出来的。
过程如下:
- 首先我们得有一个建表语句
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) )
- TiDB拿到一个SQL语句之后,首先需要使用Parser进行语法解析
上图中的代码为Parser的goyacc语法,最终SQL在Parser中走了一圈之后生成CreateTableStmt的结构,该结构具体的属性如下图所示:
- 在语法解析完成之后,就需要生一个抽象语法树AST,TiDB使用火山模型向下钻取生成语法树。 !
- 如果语法树生成的没有问题,接下来就要build一个LogicPlan,当然在build之前我们先进行一些预检查:
预检查主要包括一些表名合法性检查,列名合法性检查,约束检查,主键检查等。 - 在确保AST检查无误之后,我们开始处理步骤3中生成的AST语法树。其中在ddl_api.go中我们再做更详细的检查,并最终生成一个TableInfo的结构,这个结构中保存了所有表相关的信息。并提交一个类型为
Type: model.ActionCreateTable
的Job。 - 在ddl_worker.go接收到步骤5中的Job之后真正开始作为一个原子操作处理保存TableInfo的任务。其中
t.CreateTable(schemaID, tbInfo)
将会真正调用Hash接口的API将TableInfo
序列化之后存入后端存储中。
在存储完成之后调用job.FinishTableJob
通过前端建表语句已经执行完成。
总结: 目前看起来TiDB的代码结构相当清晰,由于并未使用任何MySQL客户端的C语言代码,所以代码也相当整洁,稍微花一些时间就能够了解到他是如何实现相关数据库操作的。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Spring Boot 工程集成全局唯一ID生成器 Vesta
本文内容脑图如下: 文章共 760字,阅读大约需要 2分钟 ! 概 述 在前一篇文章 《Spring Boot工程集成全局唯一ID生成器 UidGenerator》 中给大家推荐了一款由百度开发的基于 Snowflake算法实现的全局唯一ID生成器 UidGenerator,而本文则给大家再度推荐一款优秀的全局唯一ID生成器,名叫 Vesta。 Vesta 是艳鹏大佬的开源作品,基于Java开发,其体验地址 在此。Vesta 是一款通用的 ID产生器,互联网俗称统一发号器,其具有几大很具有优势的特性: 全局唯一 粗略有序 可反解 可制造 分布式 而且支持三种发布模式: 嵌入式发布模式 中心服务器发布模式 REST 发布模式 根据业务的性能需求,它可以产生 最大峰值型 和 最小粒度型 两种类型的 ID,它的实现架构使其具有高性能,高可用和可伸缩等互联网产品需要的质量属性,是一款通用的高性能的发号器产品。 本文就在 Spring Boot项目中将 Vesta耍起来! 注: 本文首发于 My Personal Blog:CodeSheep·程序羊,欢迎光临 小站 基础工程搭建 Spring ...
- 下一篇
GO itoa实现原理剖析
1. 前言 我们知道iota常用于const表达式中,我们还知道其值是从零开始,const声明块中每增加一行iota值自增1。 使用iota可以简化常量定义,但其规则必须要牢牢掌握,否则在我们阅读别人源码时可能会造成误解或障碍。本节我们尝试全面的总结其使用场景,另外花一小部分时间看一下其实现原理,从原理上把握可以更深刻的记忆这些规则。 2. 热身 按照惯例,我们看几个有意思的小例子,用于检测我们对于iota的理解是否准确。 2.1 题目一 下面常量定义源于GO源码,下面每个常量的值是多少? type Priority int const ( LOG_EMERG Priority = iota LOG_ALERT LOG_CRIT LOG_ERR LOG_WARNING LOG_NOTICE LOG_INFO LOG_DEBUG ) 题目解释: 上面代码源于日志模块,定义了一组代表日志级别的常量,常量类型为Priority,实际为int类型。 参考答案: iota初始值为0,也即LOG_EMERG值为0,下面每个常量递增1。 2.2 题目二 下面代码取自Go源码,请问每个常量值是多少? ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题