【问题标题】:Are these indexes doing the same thing in respect to customer_id?这些索引是否对 customer_id 做同样的事情?
【发布时间】:2019-05-20 05:52:47
【问题描述】:

我对 PostgreSQL 很陌生,所以如果我问的很明显,我很抱歉。

我有一张名为customer_products 的表。它包含以下两个索引:

CREATE INDEX customer_products_customer_id
   ON public.customer_products USING btree (customer_id)

CREATE UNIQUE INDEX customer_products_customer_id_product_id
   ON public.customer_products USING btree (customer_id, product_id)

对于customer_id,它们是否都在做同样的事情,或者它们的功能是否不同?我不确定是应该留下它们还是删除customer_products_customer_id

【问题讨论】:

  • 我不知道索引和唯一索引之间的区别,但显然你提到的两个索引位于不同的列上,所以它们不太可能做同样的事情。

标签: postgresql indexing query-performance


【解决方案1】:

第一个索引不能做第二个索引不能做的事情,所以你应该删除第一个索引。

对于WHERE(或ORDER BY)子句仅涉及customer_id的查询,第一个索引相对于第二个索引的唯一优势是索引更小。这使得对许多索引条目的范围扫描更快一些。

就大小和数据修改速度而言,额外索引的代价通常超过了这一优势。在一个只读数据仓库中,我有一个可以显着获利的查询,我可能很想保留两个索引,否则我不会。

您绝对应该删除 UNIQUE 索引,因为它有一个与性能无关的有价值的用途:它可以防止表包含两个具有保存值的行索引列。如果这是您想要保证的,UNIQUE 索引将确保您的数据保持良好状态。

旁注:虽然效果一样,但表最好有一个唯一的约束(由唯一的索引支持),而不是只有索引。如果不出意外,它会更好地记录目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-02
    • 2020-08-05
    • 2022-10-15
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多