Материалы / Истории / Экономичный индекс
История

Экономичный индекс

История о том, как замена большого B-tree индекса на BRIN помогла быстро освободить место на диске PostgreSQL.

Только Макс набрал себе кофе и уселся в кресло, как в кабинет влетел Вася из сопровождения системы отчётности. Глаза у него были круглые от страха:

  • Макс, беда! Сработал алерт - места на диске БД меньше 5%! Помоги! Что мне делать?

Макс спокойно отхлебнул кофе:

  • Отправь заявку, чтобы добавили диски…

  • Заявку уже отправил, но ты же знаешь наш банк - месяц будут добавлять! И ты знаешь моего начальника - он мне голову оторвёт.

Всё это Макс знал. Он подавил раздражение от того, что его снова отвлекают, и отхлебнул кофе:

  • Ладно, давай посмотрим, от чего у вас там можно избавиться.

  • Избавиться? Ты с ума сошел? Там нельзя ничего удалять.

Но Макс уже подключился к БД, запустил давно выверенный запрос и изучал список объектов БД отсортированный по размеру. Спустя минуту он нашел первого подозреваемого:

  • Вася, твой B-tree индекс по дате транзакции весит уже 60 Гб. Предлагаю заменить его на BRIN.

  • Какой-такой BRIN? Я не понимаю! - запаниковал Вася.

Макс улыбнулся:

  • Спокойно, сейчас объясню. BRIN (Block Range Index) хранит не каждую запись отдельно, а диапазоны значений и физическое расположение на диске. Подходит идеально, если данные хранятся последовательно, а таблицы огромные. Как раз твой случай.

Макс быстро создал новый индекс:

CREATE INDEX idx_trxn_dt_brin ON transactions USING BRIN(created_at);

Перезапустил запрос - результат был впечатляющим:

  • Старый B-tree индекс: 60 Гб

  • Новый BRIN индекс: 240 Мб

  • Невероятно! - Вася не мог поверить глазам. - А производительность сильно просядет?

  • А ты проверь, - улыбнулся Макс.

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

Макс кивнул:

  • Вот основные критерии для BRIN-индекса:

  • Данные в таблице должны поступать последовательно: даты, серийные номера.

  • Часто используется в отчётных и логирующих таблицах.

  • Не подходит для уникальных колонок.

  • Немного хуже подходит для точечных выборок.

Воодушевлённый Вася убежал, а спустя час вернулся сияющий:

  • Макс, я проверил остальные таблицы и нашёл ещё с десяток подходящих больших индексов! Удалось высвободить почти 20% места!

  • Молодец! Кофе за твой счёт, - усмехнулся Макс, заглядывая в пустую кружку.

А вы используете BRIN-индексы в своей работе? Поделитесь своим опытом в комментариях.