# Primary Key 和索引

__*_tidb_rowid*__
__*CLUSTERED PRIMARY KEY*__
__*NONCLUSTERED PRIMARY KEY*__

+ 主键具有以下约束:
  + 唯一标识表中的行
  + 不允许 **NULL**
  + 每个表只允许一个主键
  + 如果声明的主键不是 **INTEGER** 数据类型,TiDB 会为表创建非聚簇索引
    + `_tidb_rowid`: 非聚簇索引的键
  + 如果没有声明主键,TiDB 会为表创建一个隐式主键
    + `_tidb_rowid`: 隐式键值
+ **主键聚簇索引**: 表的主键即为聚簇索引,存储一行至少需要一个键值对
+ **主键非聚簇索引**: 行数据的键由隐式分配的 **_tidb_rowid** 构成, 主键在 **_tidb_rowid** 上额外再建立索引,存储一行至少需要两个键值对

-----------------------------------------------------------

目前 TiDB 的表分为以下两类:

  - CLUSTERED,表示该表的主键为聚簇索引。在聚簇索引表中,行数据的键由用户给定的主键列数据构成,因此聚簇索引表存储一行至少只要一个键值对,即
    - 主键列数据（键） - 行数据（值）

  - NONCLUSTERED,表示该表的主键为非聚簇索引。在非聚簇索引表中,行数据的键由 TiDB 内部隐式分配的 _tidb_rowid 构成,而主键本质上是唯一索引,因此非聚簇索引表存储一行至少需要两个键值对,分别为
    - _tidb_rowid（键）- 行数据（值）
    - 主键列数据（键） - _tidb_rowid（值）

聚簇索引 (clustered index) 是 TiDB 从 v5.0 开始支持的特性,用于控制含有主键的表数据的存储方式。通过使用聚簇索引,TiDB 可以更好地组织数据表,从而提高某些查询的性能。有些数据库管理系统也将聚簇索引称为"索引组织表" (index-organized tables)。
