postgres 外键是不是意味着索引?

Posted

技术标签:

【中文标题】postgres 外键是不是意味着索引?【英文标题】:Does a postgres foreign key imply an index?postgres 外键是否意味着索引? 【发布时间】:2018-07-25 08:57:50 【问题描述】:

我有一个 postgres 表(我们称这个表为 Events),它带有一个指向另一个表的复合外键(我们称这个表为 Logs)。事件表如下所示:

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】:

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

拥有这样的索引通常是个好主意,这样对父表影响到引用列的修改是有效的。

【讨论】:

以上是关于postgres 外键是不是意味着索引?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL是不是自动索引外键列?

从 Postgres 13 开始,哈希索引是不是最适合精确文本匹配查询?

Postgres 选择 BTREE 而不是 BRIN 索引

索引键是不是足够或者我应该添加外键

Postgres:强制分析器使用位图扫描而不是索引扫描

Mysql创建索引而不是外键约束