Tidb talen plan
概览
这是一个学习造一个简单的Tidb数据库的网站:https://university.pingcap.com/talent-plan/

在线操作Tidb数据库
tinysql
proj1-part2 Table Codec
这是这一部分的网址
https://github.com/tidb-incubator/tinysql/blob/course/courses/proj1-part2-README-zh_CN.md
概览
介绍表上的数据如何映射到TinyKV上
Table Codec
经过分析,一个类似有序的数组的排列可能是比较有用的,虽然PG中一个表的所有row是不可能用有序的数组形式的,PG的表存储和索引构建比较复杂,但是这里仅仅构建一个简单的Tidb数据库,因此就直接用类有序数组来存储所有行了。我觉得一个B数是一个不错的选择,具体应该是什么,看后面的课程吧。
Tidb的TinySQL是建立在TinuKV之上的,因此要构建TinyKV,要先知道TinyKV的接口:
- Key和Value都是bytes数组
 - Scan(startKey)
 - Set(Key, value)
 
在Tidb中行数据是以key-value对存在的,因此如何设计key和value的格式呢?
1  | Key: tablePrefix_tableID_recordPrefixSep_rowID  | 
其中 Key 的 tablePrefix/recordPrefixSep 都是特定的字符串常量,用于在 KV 空间内区分其他数据。 对于索引,会为每一个索引分配表内唯一的 indexID(一个索引是类似于hash或者B树之类的结构),然后按照如下规则编码成 Key-Value pair:
1  | Key: tablePrefix_tableID_indexPrefixSep_indexID_indexColumnsValue  | 
当然,我们还需要考虑非唯一索引,这个时候上面的方法就行不通了,我们需要将 rowID 也编码进 Key 里使之成为唯一的:
1  | Key: tablePrefix_tableID_indexPrefixSep_indexID_ColumnsValue_rowID  | 
从tinysql/tablecodec.go源码中可以看到tablePrefix, recordPrefixSep是什么
1  | var (  | 
测试
在tinysql目录下,测试DecodeRecordKey代码,运行:
1  | go test github.com/pingcap/tidb/tablecodec "-check.f" TestRecordKey  | 
注意,这里"-check.f"不要忘了双引号。
proj2 语法分析
2021.9.16号开始学习proj2
编译原理的知识需要仔细讲一下,或者提供一个ppt来供系统学习编译原理的状态机,词法分析,语法分析等理论。
关于TiDB SQL Parser的源码实现,有很多原理没有讲清楚,比如:
1  | %union {  | 
在parser.y文件的definitions部分,定义了很多终极符和非终极符,终极符是以小写字母开头的,非终极符是以大写字母开头的。