Индекс postgresql в столбце строки

Скажем, у меня есть таблица ResidentInfo, и в этой таблице у меня есть уникальные ограничения HomeAddress, который имеет тип VARCHAR. Для будущего запроса я добавлю индекс в этот столбец. Запрос будет иметь только операцию =, и я буду использовать шаблон B-TREE, так как в настоящее время шаблон Hash не рекомендуется.

Вопрос. Из обзора эффективности, используя B-TREE, вы думаете, что я должен добавить новый столбец с номерами 1,2,3...., N, соответствующий разному homeaddress, и вместо добавления индекса на HomeAddress, Я должен добавить индекс в столбец числа?

Я задаю этот вопрос, потому что не знаю, как работает индекс.

Ответы

Ответ 1

Для простых проверок равенства (=) индекс B-Tree в столбце varchar или text является простым и наилучшим выбором. Это, безусловно, помогает производительности.

Конечно, индекс B-Tree на простой integer работает лучше. Во-первых, сравнение простых integer значений немного быстрее. Но что более важно, производительность также зависит от размера индекса. Больший столбец означает меньшее количество строк на странице данных, значит, больше страниц нужно читать...

Так как HomeAddress вряд ли уникален, он не является хорошим естественным первичным ключом. Я бы настоятельно рекомендовал вместо этого использовать суррогатный первичный ключ. Столбец serial является для этого очевидным выбором. Его единственная цель - иметь простой, быстрый первичный ключ для работы.

Если у вас есть другие таблицы, ссылающиеся на указанную таблицу, это становится еще более эффективным. Вместо дублирования длинной строки для столбца внешнего ключа вам нужен только 4 байта для целочисленного столбца. И вам не нужно так много каскадно обновлять обновления, так как адрес должен быть изменен, а суррогатный pk может оставаться неизменным (но не обязательно, конечно).

Ваша таблица может выглядеть так:

CREATE TABLE resident (
   resident_id serial PRIMARY KEY
  ,address text NOT NULL
   -- more columns
);

CREATE INDEX resident_adr_idx ON resident(address);

Это приводит к двум индексам B-Tree. Уникальный индекс на resident_id и простой индекс на address.

Подробнее об индексах в руководстве.
Postgres предлагает множество опций - но для этого простого случая вам больше не нужно.

Ответ 2

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

В случае, если вы решите, что уникальное ограничение на адресе плохое (что, честно говоря, это: какой супруг создает отдельную учетную запись? о flatshares? и т.д.), вы можете создать ее так:

create index on ResidentInfo (HomeAddress);