Postgres знает, что запрос медленный, но молчит, какой индекс простаивает

Разбираемся, как найти бесполезные индексы в PostgreSQL, пока база не превратилась в склад тяжелых кирпичей.
Разработчики часто ставят индексы «на всякий случай» — как запасной зонт в рюкзаке, который таскаешь годами, хотя дождь был раз пять. Postgres честно сообщает, что запрос был медленным, но не скажет, какой именно индекс валяется без дела. А ведь каждый лишний индекс — это лишние гигабайты на диске и тормоза при вставке данных.
Автор нашел выход: написал анализатор всего из трех файлов. Первый же запуск показал, что 20 из 51 индекса ни разу не использовались — 78% дискового пространства под индексы выброшено на ветер. Знакомая боль, когда кажется, что «индекс ускорит всё», а на деле — просто занимает место.
Кстати, сам анализатор не требует магии — просто логи из pg_stat_user_indexes и немного SQL. Он показывает, какие индексы реально работают, а какие пора удалять без зазрения совести. Идеально для тех, кто хочет навести порядок в базе, не нанимая DBA.
Комментарий студии METABYTE: Мы тоже любим чистоту в базах — каждый неиспользуемый индекс это как лишняя зависимость в package.json: вроде не мешает, но лучше от неё избавиться до того, как проект станет размером с космический корабль.