在 Postgres 中的外键 (uuid) 列上创建索引是否有意义?

Mik*_*kov 6 postgresql index database-design

假设 Postgres 10.X 中有 2 个示例表:

CREATE TABLE public.order (
id       VARCHAR(36) NOT NULL,
...
)

CREATE TABLE public.suborder (
id       VARCHAR(36) NOT NULL,
order_id VARCHAR(36) NOT NULL,
...
CONSTRAINT fk_order FOREIGN KEY (order_id) REFERENCES public.order(id)
)
Run Code Online (Sandbox Code Playgroud)

所有 ID 都是简单的 UUID。经常suborder被查询。即使它引用唯一(UUID)值,order_id创建单独的索引是否有意义?order_id

就像是:

CREATE INDEX suborder_order_idx ON public.suborder(order_id)
Run Code Online (Sandbox Code Playgroud)

a1e*_*x07 4

通常建议在外键列上建立索引。当主表和明细表频繁连接或主表上发生删除/更新时,它会有所帮助。在这种情况下,缺少索引会导致对详细表进行全面扫描以强制执行外键。
如果您的系统符合上述任一条件,那么添加索引将是一个好主意。

边注。您提到 ids 存储 guid 值,因此您可能从不按范围搜索。那么与“普通”b 树索引相比,哈希索引将是更好的选择。

如果父表接收到删除(或 PK 上的更新),则对外键列建立索引也很有用。对于父表中被删除的每一行,数据库必须检查引用表是否仍有引用父表的行。where该检查是通过在 FK 列上使用条件从子表中进行选择来完成的。显然,如果对 FK 列建立索引,速度会更快(对于 Firebird、Oracle、SQL Server 或 DB2 等其他 DBMS 也是如此)

  • @MikhailKholodkov:据我记得,只有 Mysql 这样做(或至少这样做)。在某些情况下,FK 上的索引不会带来任何好处,只会带来额外的维护成本。假设您有一个小的货币查找表。帐户表很可能具有该货币表的 FK,但由于选择性低且缺乏针对货币的 DML,因此对此 FK 列建立索引没有任何好处 (3认同)