我对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
。
答案 0 :(得分:2)
第一个索引无法执行第二个索引不能执行的操作,因此应该删除第一个索引。
在查询WHERE
(或ORDER BY
)子句仅涉及customer_id
的查询时,第一个索引相对于第二个索引的唯一优势仅是索引较小。这使得对许多索引条目的范围扫描更快。
就大小和数据修改速度而言,额外索引的价格通常会超过该优势。在一个只读数据仓库中,我有一个查询会大量获利,我可能会想保留两个索引,否则我不会。
您绝对应该不删除UNIQUE
索引,因为它具有与性能无关的有价值的用途:它可以防止表包含具有保存值的两行用于索引列。如果您要保证这一点,那么UNIQUE
索引将确保您的数据保持良好状态。
侧面说明:即使效果相同,但表具有唯一的 constraint (由唯一索引支持)比仅具有索引更好。如果没有别的,它可以更好地说明目的。