【问题标题】:Disadvantages of removing unused foreign key indexes?删除未使用的外键索引的缺点?
【发布时间】:2013-02-21 15:06:08
【问题描述】:

正如您在 pg_stat_user_indexes 表中看到的那样,永远不会使用外键索引。我想删除它们。由于不使用而删除外键索引是否有任何缺点。

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

【问题讨论】:

  • “没有被使用”是什么意思?你失去了参照完整性......
  • @njk:删除 index 不会删除 FK 约束。
  • @a_horse_with_no_name 错过了那个重要的词。

标签: postgresql indexing foreign-keys


【解决方案1】:

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

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

如果您的应用程序实际上从未使用过 FK 检查,即它们在那里声明数据模型并让您安心,而不是期望它们实际上会被检查和强制执行,则删除引用列索引可能没问题。

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

我尚未验证 FK 强制检查是否正确显示在 pg_stat_user_indexes 中。我建议您自己检查一下;尝试在被引用的表上运行一些您知道会失败的删除操作,并查看引用列上的索引统计信息是否发生变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    相关资源
    最近更新 更多