Ответ 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 предлагает множество опций - но для этого простого случая вам больше не нужно.