与所有的关系型数据库一样,TiDB 中也存在各种“关系”
关系模型
- 基于谓词逻辑和集合论的一种数据模型,广泛被使用于数据库之中,最早于1970年由埃德加 科德提出
- 关系模型的基本假定是所有的数据都标识为数学上的关系,数据通过关系代数来进行操作
- 关系模型是采用二维表格结构表达实体类型级体系间联系的数据模型
tidb 关系分类
- 物理表
- 持久化到 tikv 中的表
- 用于存储用户数据
- 全数据库共享唯一的一份数据,不同 tidb 读到的数据完全一致
- 物理表分类
- 不包含分区的表
- 包含分区的表
- 分区
- 包含分区的表本质上是一系列分区的元数据上的组合
- 分区的kv 编码原则与普通不包含分区的表一致
- 内存表
- 在Tidb 启动后,根据表的实际定义,生成的仅存在于 TIDB 内存中的表
- 具体的实现 是 information_schema 中的表
- 虚拟表
- 仅存在表结构的定义,并没有数据
- 具体的实现是 performance_schema 中的表
- 起初是为了实现类似Mysql 同样的监控功能,即后来在Tidb 使用 Prometheus 后, 虚拟表的存在仅有兼容性上的意义
关系 到 KV 的映射
- 关系 在 TIDB中的映射
- 所有的类型的 “关系”中的元组都可以映射为 TIDB中的一组 Datum
- 一组 Datum 与表定义中的元数据结构(列属性)结合,完成表示一条数据
- TIDB 如何将“关系” 映射为 KV
- 只有屋里表,会向 KV 进行映射
- 只有物理表存在索引
- TIKV 是一个全局统一的 KV 空间
- 所有的数据都是 KV形式存储
- 所有的Key 都按照字节排序
- 相同的Key 代表相同的数据(数据版本的体现)
如何表示表数据
- tidb 中有全局唯一的 table ID,表中有全表唯一的index ID,还有全表唯一的 row ID
- 表数据 Key 格式
- [tablemark][tableid]_[rowmark][rowid] , 如 t10_r1 , t 是 table mark, 10是table id,r 是rowmark,1 是row id
- 保证table id 是全局唯一的,即可区分不同的表
- 保证表数据rowid 唯一,即可区分不同的数据
- KV 的 value 部分存储了表数据的所有列的值
如何标识唯一 / 非唯一的索引
- 索引数据 Key 格式
- [tablemark][tableid]_[indexmark][indexid][indexvalue] ,如 t10_i2a,t 是 table mark,10 是tableid,i是 indexmark,2 是indexid,a 是indexvalue
- 对于唯一索引,索引数据 Key 格式 [tablemark][tableid]_[indexmark][indexid][indexvalue]中index】value已经是表中的唯一值,已经满足Key的唯一性
- 对于非唯一索引,需要找一个表中唯一标示来让key 满足唯一性,将 key 格式拓展为[tablemark][tableid]_[indexmark][indexid][indexvalue][rowid],如t10_i2a1 ,最后的 1 即为 该非唯一索引对应的表数据的 row ID
索引与数据的映射建立
- 通过 row ID 建立起索引与数据的映射关系
- 对于唯一索引,将row ID 存储在索引 KV 的value中
- 对于非唯一索引,已经将row ID 编入 Key 中,value 部分值为空
整数类型主键
- row ID 本身即为 全表唯一的整数类型,在TIDB 中直接将带有整数类型的主键用 row ID 来代替
- 本质上形成了整数类型的聚簇索引,减少了回表操作