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

时间:2019-05-20 05:52:48

标签: postgresql indexing query-performance

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

1 个答案:

答案 0 :(得分:2)

第一个索引无法执行第二个索引不能执行的操作,因此应该删除第一个索引。

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

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

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

侧面说明:即使效果相同,但表具有唯一的 constraint (由唯一索引支持)比仅具有索引更好。如果没有别的,它可以更好地说明目的。