Экономичный индекс
История о том, как замена большого B-tree индекса на BRIN помогла быстро освободить место на диске PostgreSQL.
КейсХранениеИндексы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-индексы в своей работе? Поделитесь своим опытом в комментариях.