
| 提出者 | Edgar F. Codd(1970) |
| 约束特性 | 唯一 + 非空(NOT NULL + UNIQUE) |
| 典型实现 | InnoDB 聚簇索引;PostgreSQL IDENTITY 列 |
在关系模型里,每张表需要一种机制来区分不同的行——主键(Primary Key)就承担这个职责。它可以是单列(如整型自增 ID),也可以是多列的组合(联合主键)。关系型数据库系统会自动为主键建立唯一索引,任何试图插入重复或 NULL 值的操作都会被拒绝。
Edgar F. Codd 在 1970 年的论文《A Relational Model of Data for Large Shared Data Banks》里正式提出了关系模型中主键的概念,从此成为所有 RDBMS 的基础设施。[1]
最常见的主键类型有两种:整型自增(AUTO_INCREMENT / SERIAL)和 UUID。整型自增写入时是顺序追加,B+ 树页分裂少,性能好;UUID 天然全局唯一,方便分布式系统合并数据,但随机写入会造成大量页分裂,在 InnoDB 里会拖慢写吞吐。
MySQL 8.0 引入了 INVISIBLE COLUMNS,而 PostgreSQL 10 起支持 GENERATED ALWAYS AS IDENTITY,都让自增主键的管理更加规范。分布式场景下,Twitter 的 Snowflake、美团的 Leaf 等方案在自增语义基础上加入了节点信息,兼顾唯一性和顺序写性能。
InnoDB 的主键天然是聚簇索引(Clustered Index):行数据就存储在主键 B+ 树的叶节点里,按主键顺序排列。这意味着按主键范围查询几乎不需要回表。相比之下,MyISAM 和 PostgreSQL 的堆表都是非聚簇的,主键索引叶节点存储的是行指针,需要额外一跳才能取到完整行。因此同样的 SQL,在 InnoDB 和 PostgreSQL 上的执行路径有本质区别,选型时需要留意。

| 提出者 | Edgar F. Codd(1970) |
| 约束特性 | 唯一 + 非空(NOT NULL + UNIQUE) |
| 典型实现 | InnoDB 聚簇索引;PostgreSQL IDENTITY 列 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧