# 行记录映射到 `KV` 

__*行与键值对映射*__

+ Key 的形式: **`tablePrefix{TableID}_recordPrefixSep{RowID}`**
+ 表数据与 KV 的映射
```
1, "TiDB", "SQL Layer", 10: ~!@t10_r1@!~ --> ["TiDB", "SQL Layer", 10]
2, "TiKV", "KV Engine", 20: ~!@t10_r2@!~ --> ["TiKV", "KV Engine", 20]
3, "PD", "Manager", 30: ~!@t10_r3@!~ --> ["PD", "Manager", 30]
```

-------------------------------------------------------------
TiDB 在 TiKV 提供的分布式存储能力基础上,构建了兼具优异的交易处理能力与良好的数据分析能力的计算引擎。本文首先从数据映射算法入手介绍 TiDB 如何将库表中的数据映射到 TiKV 中的 `(Key, Value)` 键值对,然后描述 TiDB 元信息管理方式,最后介绍 TiDB SQL 层的主要架构。

在关系型数据库中,一个表可能有很多列。要将一行中各列数据映射成一个 `(Key, Value)` 键值对,需要考虑如何构造 `Key`。首先,`OLTP` 场景下有大量针对单行或者多行的增、删、改、查等操作,要求数据库具备快速读取一行数据的能力。因此,对应的 `Key` 最好有一个唯一 `ID`（显示或隐式的 `ID`）,以方便快速定位。其次,很多 `OLAP` 型查询需要进行全表扫描。如果能够将一个表中所有行的 `Key` 编码到一个区间内,就可以通过范围查询高效完成全表扫描的任务。

  - 为了保证同一个表的数据放在一起,方便查找,TiDB 会为每个表分配一个表 `ID`,用 `TableID` 表示。表 `ID` 是一个整数,在整个集群内唯一。
  - TiDB 会为表中每行数据分配一个行 `ID`,用 `RowID` 表示。行 `ID` 也是一个整数,在表内唯一。对于行 `ID`,TiDB 做了一个小优化,如果某个表有整数型的主键,TiDB 会使用主键的值当做这一行数据的行 `ID`。

每行数据按照如下规则编码成 (Key, Value) 键值对:
```
Key:   tablePrefix{TableID}_recordPrefixSep{RowID}
Value: [col1, col2, col3, col4]
```

