# SCHEMA 的设计 - TiDB 自增 ID（A）

+ `AUTO_INCREMENT` 的基本使用
```
CREATE TABLE t(id int PRIMARY KEY AUTO_INCREMENT, c int);
INSERT INTO t(c) VALUES (1);
INSERT INTO t(c) VALUES (2);
INSERT INTO t(c) VALUES (3), (4), (5);
INSERT INTO t(id, c) VALUES (8, 6), (9, 7);

SELECT * FROM t;

+----+---+
| id | c |
+----+---+
| 1  | 1 |
| 2  | 2 |
| 3  | 3 |
| 4  | 4 |
| 5  | 5 |
| 8  | 6 |
| 9  | 7 |
+—--—+---+
```
-------------------------------------------------------------
TiDB 自增 ID
Schema 的自增 ID 属性，是非常重要的 Schema 属性，通过自动填充缺省列的值，来保证插入 Table 的相关数据是趋势递增的。
因为 TiDB 的 Region 是以 Range 形势存储的 ，使用自增 ID 在大规模数据插入的场景下，会产生非常明细的写入热点问题。这很容易使 单台 TiKV 节点的性能激增，从而不能有效的使用各各 TiKV 节点的性能，来提升系统吞吐能力
AUTO_INCREMENT
- 基本使用
```
CREATE TABLE t(id int PRIMARY KEY AUTO_INCREMENT, c int);
INSERT INTO t(c) VALUES (1);
INSERT INTO t(c) VALUES (2);
INSERT INTO t(c) VALUES (3), (4), (5);
INSERT INTO t(id, c) VALUES (8, 6), (9, 7);
SELECT * FROM t;
+----+---+
| id | c |
+----+---+
| 1  | 1 |
| 2  | 2 |
| 3  | 3 |
| 4  | 4 |
| 5  | 5 |
| 8  | 6 |
| 9  | 7 |
+——+---+
```

- 实现原理
  - 每一个自增列使用一个全局可见的键值对用于记录当前已分配的最大 ID
  - 这一全局可见的键值对是由 PD 来进行统一分配的
  - 为了降低分布式系统分配 自增 ID 的网络开销，每个 TiDB 节点会缓存一个不重复的 ID 段；
  - 当前 预分配的 ID 段使用完毕，或 TiDB 重启。都会再重新向 PD 再次申请新的 ID 段
