1

我正在尝试提高查找性能。假设我有一张桌子

CREATE TABLE tab (
  id SERIAL, -- PRIMARY KEY
  code VARCHAR(20),
  ....
  ....
);

我只需要通过“代码”查找“id”(PK)值(不需要该表中的任何其他字段),就像这样。

SELECT id FROM tab WHERE code IN ('a', 'b', 'c').

我可以在“代码”上创建一个简单的索引,如下所示:

CREATE INDEX tab_code_idx ON tab USING btree(code);

我也知道 PostgreSQL 9.2+ 仅在索引包含查询中引用的所有字段的情况下实现索引扫描。所以我的问题是这个。我会从创建包含“代码”和“id”的索引中受益吗:

CREATE INDEX tab_code_id_idx ON tab USING btree(code, id);

我搜索并可以找到有关 PK 值是否包含在该表的其他索引中的任何信息。如果 PK 包含在所有索引中,那么我只需要索引“代码”即可查找“id”值。

4

1 回答 1

2

当创建 PK 时,会创建相应的索引,包括 PK 列。没有创建其他索引。要在 psql 提示符下显示该表类型的所有索引:

=> \d tab

包含两者的索引codeid是该查询中仅索引扫描所必需的。

于 2013-10-04T09:18:35.437 回答