45

在 MySQL 中,当我创建复合主键时,例如使用 columns X, Y, Z,所有三列都会自动成为索引。Postgres 也会发生同样的情况吗?

4

3 回答 3

117

如果你创建一个复合主键 on (x, y, z),PostgreSQL 会借助一个UNIQUE多列 btree 索引 on来实现这一点(x, y, z)。此外,所有三列都是(隐式),这是 a和 aNOT NULL之间的主要区别。PRIMARY KEYUNIQUE INDEX

除了对数据的明显限制外,多列索引x对查询性能的影响也与、y和上的三个单独索引有所不同z

dba.SE的相关讨论:

通过示例、基准、讨论和展望Postgres 9.2 中仅索引扫描的新功能。

特别是,主键 on将(x, y, z)加速条件为 onx或最佳的查询。它还有助于查询、或,但程度要小得多。(x,y)(x,y,z)yz(y,z)(x,z)

如果您需要加快对后一种组合的查询,您可能需要更改 PK 约束中的列顺序和/或创建一个或多个附加索引。看:

于 2012-07-05T21:03:35.563 回答
2

不,你得到一个三列主键的索引。

于 2012-07-05T20:54:43.230 回答
0

是的

当为表定义唯一约束或主键时,PostgreSQL 会自动创建唯一索引。索引涵盖构成主键或唯一约束的列(多列索引,如果适用),并且是强制执行约束的机制。

于 2012-07-05T20:42:48.663 回答