【问题标题】:PostgreSQL indices- are these redundant?PostgreSQL 索引——这些是多余的吗?
【发布时间】:2010-08-19 21:58:35
【问题描述】:
CREATE INDEX alias_pub_idx2
  ON info.palias
  USING btree
  (publisher_id, player_id, pub_player_id);

CREATE INDEX alias_pub_idx3
  ON info.palias
  USING btree
  (player_id);

第一个包括三列;后者仅包括一个。我认为它们是多余的——第一个 btree 索引就足够了,但我对 PostgreSQL 索引方法并不十分熟悉。想法?

【问题讨论】:

  • 有效吗?上次听说,PostgreSQL 不支持覆盖索引,alias_pub_idx2 就是这样。
  • 这就是我最初的想法,OMG - 但它们没有涵盖索引 - info.palias 必须是 schema.table 语法。
  • 是的,对不起,info.palias 是 schema.table..

标签: sql postgresql indexing


【解决方案1】:

PostgreSQL 多列索引是“有序的”,这意味着只有当player_idalias_pub_idx2 中提到的第一列时,这才是多余的。

然而,这将是多余的:

CREATE INDEX alias_pub_idx2
  ON info.palias
  USING btree
  (publisher_id, player_id, pub_player_id);

CREATE INDEX alias_pub_idx3
  ON info.palias
  USING btree
  (publisher_id); /* first column of another index => waste of space */

【讨论】:

  • 所以说如果 player_id 是更多加入的列(到目前为止),它应该是索引中的第一列,还是有自己的独立索引?
  • @Wells 是的,没错。从文档中:“当前导(最左边)列有约束时,索引最有效”
【解决方案2】:

这两个索引都不会使另一个索引变得多余 - 如果 publisher_id 不是标准,则针对查找特定 player_ids 的 info.palias 查询将优先于第一个索引。

【讨论】:

    【解决方案3】:

    使用 btree

    BTREE indexes are ordered,这就是为什么你的第二个索引是多余的:第一列是相同的,可以在所有以 player_id 为条件的查询中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多