1. TiDB概述
TiDB 是一款开源 分布式关系型数据库,同时支持 在线事务处理(OLTP) 与 在线分析处理(OLAP) 的混合型(Hybrid Transactional and Analytical Processing, HTAP) 分布式数据库,具备水平扩容或缩容、金融级高可用、实时 HTAP、Kubernetes 云原生的分布式数据库、兼容 MySQL 5.7 协议和 MySQL 生态等重要特性,支持在本地和云上部署。
与传统的单机 MySQL 数据库相比,TiDB 具有以下优势:
-
分布式架构: 纯分布式架构,拥有良好的扩展性,支持弹性的扩缩容
-
兼容MySQL: 支持 SQL,对外暴露 MySQL 的网络协议,并兼容大多数 MySQL 的语法,在大多数场景下可以直接替换 MySQL
-
高可用部署: 默认支持高可用,在少数副本失效的情况下,数据库本身能够自动进行数据修复和故障转移,对业务透明
-
支持强一致性: 符合CAP理论的CP,支持 ACID 事务,对于一些有强一致需求的场景友好,例如:银行转账
-
丰富的开源生态链: 具有丰富的工具链生态,覆盖数据迁移、同步、备份等多种场景
2. TiDB组件
在内核设计上,TiDB 分布式数据库将整体架构拆分成了多个模块,各模块之间互相通信,组成完整的 TiDB 系统。对应的架构图如下:
计算引擎层:TiDB/TiSpark
存储引擎层:TiKV/TiFlash
3. TiKV键值对数据是如何组织的
1. 表数据映射到KV
由于 TiDB 底层基于键值对存储数据,TiDB 表中的 行数据 需要按照一定格式映射转换为 键值对:
-
为了保证同一张表的数据放在一起,方便查找,TiDB 会为每个表分配一个 表 ID,用 TableID 表示。表 ID 是一个整数,在整个 集群内唯一。
-
TiDB 会为表中每行数据分配一个 行 ID,用 RowID 表示。行 ID 也是一个整数,在表内唯一。对于行 ID,TiDB 做了一个小优化,如果某个表有整数型的主键,TiDB 会使用主键的值当做这一行数据的行 ID。
每行数据按照如下规则编码成 (Key, Value) 键值对:
Key: tablePrefix{TableID}_recordPrefixSep{RowID}
Value: [col1, col2, col3, col4]
2. 表索引映射到KV
TiDB 同时支持 主键索引 和 二级索引。与表数据映射方案类似,TiDB 为表中每个索引分配了一个 索引 ID,用 IndexID 表示。
-
对于 主键索引 和 唯一索引,需要根据键值快速定位到对应的 RowID,因此,按照如下规则编码成 (Key, Value) 键值对:
Key: tablePrefix{TableID}_indexPrefixSep{IndexID}_indexedColumnsValue
Value: RowID
-
对于非唯一性约束的 普通二级索引,一个键值可能 对应多行,需要根据 键值范围 查询对应的 RowID。因此,按照如下规则编码成 (Key, Value) 键值对:
Key: tablePrefix{TableID}_indexPrefixSep{IndexID}indexedColumnsValue{RowID}
Value: null
3. KV映射示例
数据与 KV 的映射关系,定义如下:
复制tablePrefix = []byte{'t'}recordPrefixSep = []byte{'r'}indexPrefixSep = []byte{'i'}1.2.3.
假设表结构如下:
复制CREATE_TABLE User ( ID int, Name varchar(20), Role varchar(20), Age int, UID int, PRIMARY KEY (ID), KEY idxAge (Age), UNIQUE KEY idxUID (UID));1.2.3.4.5.6.7.8.9.10.
假设表数据如下:
复制1, "TiDB", "SQL Layer", 10, 100012, "TiKV", "KV Engine", 20, 100023, "PD", "Manager", 30, 100031.2.3.
-
表数据映射到KV如下:
t10_r1 --> ["TiDB", "SQL Layer", 10, 10001]t10_r2 --> ["TiKV", "KV Engine", 20, 10002]t10_r3 --> ["PD", "Manager", 30, 10003]1.2.3.
-
唯一索引映射到KV如下:
t10_i1_10001 --> 1t10_i2_10002 --> 2t10_i3_10003 --> 31.2.3.
-
非唯一索引映射到KV如下:
# 假设 IndexID 为 1t10_i1_10_1 --> nullt10_i1_20_2 --> nullt10_i1_30_3 --> null1.2.3.4标签:--,TIDB,TiKV,索引,键值,KV,TiDB,ID From: https://www.cnblogs.com/xiaohuozi6/p/18214122