在MySQL中,当我创建复合主键时,比如列X, Y, Z
,那么所有三列都会自动成为索引。 Postgres会发生同样的事吗?
答案 0 :(得分:69)
如果在(x, y, z)
上创建复合主键,PostgreSQL会在UNIQUE
上的一个(x, y, z)
多列btree索引的帮助下实现此功能。此外,所有三列都必须为NOT NULL
,这当然是PRIMARY KEY
和UNIQUE INDEX
之间的主要区别。
除了明显的数据限制外,multi-column index对查询效果的影响也不同于x
,y
和z
上的三个单独索引
我们最近对on dba.SE in this related question进行了非常详尽的讨论。通过index-only scans in version 9.2即将发布的功能的示例,基准,讨论和展望。
特别是,(x, y, z)
上的主键可以最佳地加快x
,(x,y)
或(x,y,z)
条件的查询速度。它还有助于y
,z
,(y,z)
或(x,z)
上的查询,但程度要小得多。
如果您需要加快对后一种组合的查询,您可能希望更改PK约束中的列顺序或创建一个或多个其他索引。
答案 1 :(得分:2)
Yes:
当为表定义唯一约束或主键时,PostgreSQL会自动创建唯一索引。索引涵盖构成主键或唯一约束的列(如果适用,则为多列索引),并且是强制执行约束的机制。
答案 2 :(得分:1)
不,你得到三列主键的一个索引。