Короткие индексы

Заметка содержит несколько кейсов с индексами для больших таблиц.

Короткие индексы работают чуть быстрее, чем полные, но основное преимущество – компактность.

Высокоселективный индекс

Вы заметили, что к таблице часто обращаются запросы с отбором строк по конкретному высокоселективному значению.

Вам однозначно нужен индекс именно на это значение. Места такой индекс много не займет, так как строк мало.

CREATE INDEX index_name ON table_name USING BTREE (column_name) WHERE column_name = 1;

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

Динамический индекс

Вы заметили, что к таблице часто обращаются запросы с отбором строк за небольшой интервал (последний день / неделя / месяц).

Если данные хотя бы примерно упорядочены по опорному полю (со значениями меток времени), то можно использовать BRIN индекс, он очень компактный.

Или можно использовать динамический индекс с ограничением значений по опорному полю.

CREATE OR REPLACE FUNCTION index_name_from() RETURNS timestamp -- должен совпадать с типом опорного поля LANGUAGE sql IMMUTABLE AS $function$ SELECT CURRENT_DATE - INTERVAL '1 week' -- глубина = неделя $function$; CREATE INDEX index_name ON table_name USING BTREE (column_name) -- или BRIN индекс WHERE column_name > index_name_from();

Индекс нужно обновлять раз в день / неделю.

REINDEX INDEX CONCURRENTLY index_name;

» Динамический индекс может быть более простой альтернативой контролю индексов отдельных партиций.

Начать дискуссию