На одном проекте команда потратила три спринта, пытаясь выяснить, почему простой запрос на выборку пользователей выполняется 12 секунд. Индексы были, планировщик их использовал, но нагрузка на базу росла. А потом выяснилось, что эти индексы... мешали. Они занимали половину памяти, вызывали блокировки при записи и просто не подходили под тип данных и характер запросов.
Сегодня мы разберём, как не попасть в такую ситуацию. Я покажу, как PostgreSQL выбирает индексы, почему иногда игнорирует их, какие типы индексов подходят для разных задач, и как строить индексы в highload‑среде, чтобы они не стали узким местом.