Postgresql 删除未使用的外键索引的缺点?

Postgresql 删除未使用的外键索引的缺点?,postgresql,indexing,foreign-keys,Postgresql,Indexing,Foreign Keys,从pg_stat_user_index表中可以看出,从来没有使用外键索引。我想把它们去掉。由于不使用外键索引,删除外键索引是否有任何缺点 db=# SELECT * FROM pg_stat_user_indexes WHERE relname='order_cancellationreason'; relid | indexrelid | schemaname | relname | indexrelname

从pg_stat_user_index表中可以看出,从来没有使用外键索引。我想把它们去掉。由于不使用外键索引,删除外键索引是否有任何缺点

db=# SELECT * FROM pg_stat_user_indexes WHERE relname='order_cancellationreason';
     relid | indexrelid | schemaname |         relname          |                indexrelname                 | idx_scan | idx_tup_read | idx_tup_fetch 
    -------+------------+------------+--------------------------+---------------------------------------------+----------+--------------+---------------
     29835 |      31055 | public     | order_cancellationreason | order_cancellationreason_address_id         |        0 |            0 |             0
     29835 |      31053 | public     | order_cancellationreason | order_cancellationreason_cancelled_by_id    |        0 |            0 |             0



 db=#\d+ order_cancellationreason
     ...
     Indexes:
        "order_cancellationreason_cancelled_by_id" btree (cancelled_by_id)
        "order_cancellationreason_address_id" btree (address_id)

    Foreign-key constraints:
        "cargo_id_refs_id_f4ffe34d" FOREIGN KEY (cargo_id) REFERENCES cargo_cargoinfo(id) DEFERRABLE INITIALLY DEFERRED
        "order_cancellationreason_address_id_fkey" FOREIGN KEY (address_id) REFERENCES invoice_address(id) DEFERRABLE INITIALLY DEFERRED
        "order_cancellationreason_cancelled_by_id_fkey" FOREIGN KEY (cancelled_by_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED

引用完整性强制不需要引用外键列上的索引。您只需要在引用列上为该列创建一个唯一索引

删除引用列上的索引的唯一缺点是检查和执行可能非常缓慢。如果试图从FK目标表中删除一行,数据库必须检查该值是否出现在引用列中,并拒绝删除,或者,对于删除级联键上的
,将其删除。无论哪种方式,如果引用列上没有索引,这都可能导致seqscan。对于小的引用表,这很好,但是对于大的引用表,尤其是在进行多个FK检查的情况下,性能可能非常糟糕

如果您的应用程序从来没有实际使用过FK检查,即它们是为了声明数据模型并让您安心,而不是期望实际检查和强制执行FK检查,那么删除引用列索引就可以了

如果您的应用程序实际对引用的表执行删除或更新,我建议保留索引


我尚未验证FK强制检查是否正确显示在
pg\u stat\u user\u索引中。我建议你自己检查一下;尝试在引用的表上运行一些您知道会失败的删除操作,并查看引用列上的索引统计信息是否会更改。

什么是“未被使用?”您将失去引用完整性…@njk:删除索引不会删除FK约束。@n没有名称的\u horse\u遗漏了那个重要的词。