【问题标题】:Does column order matter in PostgreSQL tables? [duplicate]PostgreSQL 表中的列顺序重要吗? [复制]
【发布时间】:2016-03-30 21:01:59
【问题描述】:

例如,我有表用户(id、用户名、电子邮件)。

以下查询有什么区别吗? (可能是性能,或其他)

SELECT id, username, email FROM users

SELECT id, email, username FROM users

一般来说,创建 PostgreSQL 表的列顺序是否重要?

【问题讨论】:

标签: postgresql


【解决方案1】:

在 PostgreSQL 中创建表时列的顺序并不重要,但有时在 PostgreSQL 中创建索引时却很重要。

PostgreSQL 使用底层唯一索引实现主键。如果主键包含多于一列,那么 PostgreSQL 会按照您声明它们的顺序使用列创建底层索引。一些针对该主键的部分的查询将能够使用索引;有些不会。

此引用来自docs on multicolumn indexes

多列 B 树索引可以与以下查询条件一起使用 涉及索引列的任何子集,但索引是最 当前导(最左边)有约束时有效 列。确切的规则是对领先的平等约束 列,加上第一列上的任何不等式约束 没有等式约束,将用于限制 被扫描的索引。对右侧列的约束 这些列在索引中被检查,因此它们保存对 表正确,但它们不会减少索引的部分 被扫描。例如,给定 (a, b, c) 上的索引和查询 条件 WHERE a = 5 AND b >= 42 AND c = 77 的索引条目将被跳过, 但它们仍然必须被扫描。这个索引可以在 原则用于对 b 和/或 c 有约束的查询 对 a 没有限制——但必须扫描整个索引,所以 在大多数情况下,计划者更喜欢顺序表扫描 使用索引。

【讨论】:

  • 感谢您的回答。它仅与主键有关吗?还是其他索引也是如此?
  • 对所有多于一列的索引都为真。
  • 这与表格中的列顺序无关。
【解决方案2】:

这确实很重要……有时稍微有点。有类似data structure alignment 的东西。如果您开始使用小于 4 字节的混合类型(smallint、char(1) 等),如果您交错它们,您的表可能会变得更大。如果您确实使用至少 4 个字节的类型,则顺序无关紧要。

有一个很好的阅读https://www.2ndquadrant.com/en/blog/on-rocks-and-sand/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2011-01-12
    • 1970-01-01
    • 2015-07-18
    相关资源
    最近更新 更多