这些索引是否对 customer_id 做同样的事情?

Are these indexes doing the same thing in respect to customer_id?

我是 PostgreSQL 的新手,如果我问的是显而易见的问题,我深表歉意。

我有一个 table 叫 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.

没有什么是第一个索引可以做而第二个索引做不到的,所以您应该删除第一个索引。

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

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

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

旁注:尽管效果相同,但如果 table 具有唯一的 constraint(由唯一索引支持)会更好只是有索引。如果不出意外,它会更好地记录目的。