【问题标题】:PostgreSQL composite primary keyPostgreSQL 复合主键
【发布时间】:2012-07-06 07:31:33
【问题描述】:

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

【问题讨论】:

  • 你的意思是 MySQL 创建 三个 索引?听起来很奇怪

标签: postgresql indexing composite-primary-key


【解决方案1】:

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

除了对数据的明显限制之外,multi-column index 对查询性能的影响也与 xyz 上的三个单独索引的影响有所不同。

关于dba.SE的相关讨论:

通过示例、基准、讨论和对index-only scans in Postgres 9.2 新功能的展望。

特别是,(x, y, z) 上的主键将优化以x(x,y)(x,y,z) 为条件的查询。它还有助于查询yz(y,z)(x,z),但程度要小得多。

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

【讨论】:

  • 因此,如果我在多个列上添加 UNIQUE,例如 UNIQUE(a,c),那么它将在后台为整个 (a,c) 创建一个唯一索引,但它也会为 ac 分开?因为以后我可能只需要在c 列或a 列上进行搜索。请指教
  • @AlwaysSunny:不,只在(a,c) 上创建一个 多列索引。但该索引仍可用于(接近最佳)搜索(a) 和(低得多的效率)搜索(c)。考虑在(c)(c,a) 上添加一个索引。但请先阅读上面的两个链接答案。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    Yes:

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

    【讨论】:

    • 我认为问题是每列是否都有自己的索引。
    • 同意。问题不在于是否自动创建了 1 个多列索引,而是是否创建了 3 个单列索引。答案是否定的。当然,在经过编辑后,您的答案仍然具有相关性,因为它提供了补充信息。事实上,@dondi-michael-stroma 的答案比原请求者选择的答案更相关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多