PostgreSQL外键是否意味着索引?

27

我有一个 postgres 表格(我们称之为 Events),它具有对另一个表格的组合外键引用(我们称之为 Logs)。 Events 表格看起来像这样:

CREATE TABLE Events (
   ColPrimary UUID,
   ColA VARCHAR(50),
   ColB VARCHAR(50),
   ColC VARCHAR(50),
   PRIMARY KEY (ColPrimary),
   FOREIGN KEY (ColA, ColB, ColC) REFERENCES Logs(ColA, ColB, ColC)
);
在这种情况下,我知道我可以通过主键高效地搜索事件,并连接到日志。
我感兴趣的是,这个外键是否在事件表上创建了一个索引,即使没有连接也会有用。例如,以下查询是否会从FK中受益?
SELECT * FROM Events
WHERE ColA='foo' AND ColB='bar'

注意:我已经对一个非常类似的情况运行了POSTGRES EXPLAIN,并且发现查询将导致全表扫描。我不确定这是因为FK对此查询没有帮助,还是因为我的数据规模较小,在当前规模下扫描更有效率。

1个回答

45

PostgreSQL在外键定义的列上不会自动创建索引。如果你需要这样的索引,你需要自己创建。

通常情况下建议这样做,以使得修改父表中影响到引用列的操作更加高效。


1
在许多情况下,人们不会修改甚至删除PK条目,但即使在这些情况下,如果您发现这些列在连接场景/查找中使用,则可能希望在FK列上添加索引。由于索引并非免费,请务必通过EXPLAIN进行验证。 - xzilla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接