# 行与 KV 映射

+ KEY 模式：**`tablePrefix{TableID}_recordPrefixSep{RowID}`**
+ 表数据到 KV 的映射
+ TiKV 是一个巨大的排序键值映射

```10
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]
```
-------------------------------------------------------------
根据 TiKV 提供的分布式存储能力，TiDB 构建了一个集卓越的事务处理能力和良好的数据分析能力于一体的计算引擎。本章节会首先介绍 TiDB 是如何将库表中的数据映射到 TiKV 中的 (Key, Value) Key-Value pair，然后介绍 TiDB 元数据管理方法，最后介绍了 TiDB SQL 层的主要架构。

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

  - 为了确保将同一张表的数据放在一起并且易于查找，TiDB 会对每张表分配一个表 ID，用 TableID 表示。表 ID 是一个整数，在整个集群中是唯一的。
  - TiDB 将为表中的每一行数据分配一个行 ID ，用 rowID 表示。行 ID 也是一个整数，在表中唯一。对于行 ID ，TiDB 进行了一些小的优化。如果一个表具有 int 主键，TiDB 将使用主键的值作为行数据的行ID。

每一行数据都根据以下规则编码为 (Key, Value) Key-Value对：
  KEY：`tablePrefix{TableID}_recordPrefixSep{RowID}`
  值: `[col1, col2, col3, col4]`
  
注意：此幻灯片展示了表行的映射模式，索引以略微不同方式存储。