【发布时间】:2012-07-06 07:31:33
【问题描述】:
在 MySQL 中,当我创建一个复合主键时,比如列 X, Y, Z,那么所有三个列都会自动成为索引。 Postgres 也会发生同样的情况吗?
【问题讨论】:
-
你的意思是 MySQL 创建 三个 索引?听起来很奇怪
标签: postgresql indexing composite-primary-key
在 MySQL 中,当我创建一个复合主键时,比如列 X, Y, Z,那么所有三个列都会自动成为索引。 Postgres 也会发生同样的情况吗?
【问题讨论】:
标签: postgresql indexing composite-primary-key
如果您在(x, y, z) 上创建复合主键,PostgreSQL 会借助(x, y, z) 上的一个UNIQUE 多列btree 索引来实现这一点。此外,所有三列都是NOT NULL(隐式),这是PRIMARY KEY 和UNIQUE INDEX 之间的主要区别。
除了对数据的明显限制之外,multi-column index 对查询性能的影响也与 x、y 和 z 上的三个单独索引的影响有所不同。
关于dba.SE的相关讨论:
通过示例、基准、讨论和对index-only scans in Postgres 9.2 新功能的展望。
特别是,(x, y, z) 上的主键将优化以x、(x,y) 或(x,y,z) 为条件的查询。它还有助于查询y、z、(y,z) 或(x,z),但程度要小得多。
如果您需要加快对后一种组合的查询,您可能需要更改 PK 约束中的列顺序和/或创建一个或多个附加索引。见:
【讨论】:
UNIQUE(a,c),那么它将在后台为整个 (a,c) 创建一个唯一索引,但它也会为 a 和c 分开?因为以后我可能只需要在c 列或a 列上进行搜索。请指教
(a,c) 上创建一个 多列索引。但该索引仍可用于(接近最佳)搜索(a) 和(低得多的效率)搜索(c)。考虑在(c) 或(c,a) 上添加一个索引。但请先阅读上面的两个链接答案。
不,你得到一个三列主键的索引。
【讨论】:
Yes:
当为表定义唯一约束或主键时,PostgreSQL 会自动创建唯一索引。索引涵盖构成主键或唯一约束的列(多列索引,如果适用),并且是强制执行约束的机制。
【讨论】: