这些索引是否对 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(由唯一索引支持)会更好只是有索引。如果不出意外,它会更好地记录目的。
我是 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(由唯一索引支持)会更好只是有索引。如果不出意外,它会更好地记录目的。