首页 > 解决方案 > 这些索引是否对 customer_id 做同样的事情?

问题描述

我对 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.

标签: postgresqlindexingquery-performance

解决方案


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

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

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

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

旁注:即使效果相同,如果表具有唯一约束(由唯一索引支持)比仅具有索引更好。如果不出意外,它会更好地记录目的。


推荐阅读