Эти индексы делают то же самое в отношении customer_id? - PullRequest
2 голосов
/ 20 мая 2019

Я довольно новичок в 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 Ответ

2 голосов
/ 20 мая 2019

Первый индекс не может сделать ничего, что не может сделать второй, поэтому вы должны отбросить первый индекс.

Единственное преимущество первого индекса перед вторым, когда речь идет о запросах, WHERE(или ORDER BY) предложение включает customer_id только в том случае, если индекс меньше.Это делает сканирование диапазона по многим элементам индекса несколько быстрее.

Цена за дополнительный индекс с точки зрения размера и скорости изменения данных обычно перевешивает это преимущество.В хранилище данных только для чтения, где у меня есть запрос, который приносит значительную прибыль, у меня может возникнуть соблазн сохранить оба индекса, иначе я бы не стал.

Вы определенно должны не отбросить UNIQUE index, потому что он имеет ценное применение, не имеющее ничего общего с производительностью: он не позволяет таблице содержать две строки, в которых есть значения сохранения для индексированных столбцов.Если это то, что вы хотите гарантировать, индекс UNIQUE обеспечит поддержание ваших данных в хорошем состоянии.

Примечание: даже если эффект тот же, лучше, если в таблице естьуникальное ограничение (которое поддерживается уникальным индексом), чем просто наличие индекса.Если ничего другого, это лучше документирует цель.

...