postgres 外键是否意味着索引?
Does a postgres foreign key imply an index?
我有一个 postgres table(我们称之为 table Events
),它有一个到另一个 table 的复合外键(我们称之为 table Logs
)。事件 table 看起来像这样:
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)
);
在这种情况下,我知道我可以通过主键高效地搜索事件,并加入到日志中。
我感兴趣的是,如果这个外键在事件 table 上创建一个索引,即使没有加入也很有用。例如,以下查询是否会从 FK 中受益?
SELECT * FROM Events
WHERE ColA='foo' AND ColB='bar'
注意:我有 运行 POSTGRES EXPLAIN 用于与此非常相似的情况,并且看到查询将导致完整的 table 扫描。我不确定这是否是因为 FK 对此查询没有帮助,或者我的数据量较小并且在我当前的规模下扫描效率更高。
PostgreSQL 不会 自动在定义了外键的列上创建索引。如果您需要这样的索引,您将不得不自己创建它。
拥有这样的索引通常是个好主意,这样影响引用列的父项 table 上的修改是有效的。
我有一个 postgres table(我们称之为 table Events
),它有一个到另一个 table 的复合外键(我们称之为 table Logs
)。事件 table 看起来像这样:
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)
);
在这种情况下,我知道我可以通过主键高效地搜索事件,并加入到日志中。
我感兴趣的是,如果这个外键在事件 table 上创建一个索引,即使没有加入也很有用。例如,以下查询是否会从 FK 中受益?
SELECT * FROM Events
WHERE ColA='foo' AND ColB='bar'
注意:我有 运行 POSTGRES EXPLAIN 用于与此非常相似的情况,并且看到查询将导致完整的 table 扫描。我不确定这是否是因为 FK 对此查询没有帮助,或者我的数据量较小并且在我当前的规模下扫描效率更高。
PostgreSQL 不会 自动在定义了外键的列上创建索引。如果您需要这样的索引,您将不得不自己创建它。
拥有这样的索引通常是个好主意,这样影响引用列的父项 table 上的修改是有效的。