Жалоба «база тормозит», а на графиках CPU 30% и памяти хватает. Чаще всего виноват не сервер, а пара запросов, которые читают таблицу целиком. Найти их можно за несколько минут.
🟢 Включите статистику запросов. Расширение pg_stat_statements копит время выполнения по каждому запросу. В
postgresql.conf:shared_preload_libraries = 'pg_stat_statements'После перезапуска в нужной базе:
CREATE EXTENSION pg_stat_statements;🟢 Найдите самые дорогие запросы. Сортируйте по суммарному времени, а не по самому долгому запросу: короткий запрос, вызванный миллион раз, нагружает базу сильнее.
SELECT calls,
round(total_exec_time) AS total_ms,
round(mean_exec_time, 1) AS avg_ms,
left(query, 80) AS query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 5;
🟢 Посмотрите план запроса:
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders WHERE customer_id = 42;
Seq Scan on orders и тысячи страниц в Buffers: shared read значат, что таблица читается целиком.🟢 Добавьте индекс и проверьте план ещё раз:
CREATE INDEX CONCURRENTLY idx_orders_customer ON orders (customer_id);CONCURRENTLY строит индекс без блокировки записи в таблицу, на проде это важно. В плане должен появиться Index Scan.Сегодня в 19:00 Николай Лавлинский покажет PMM: он собирает такую статистику по PostgreSQL и MySQL в дашборды, чтобы не ходить в каждую базу с SQL. Участие бесплатное, регистрация по кнопке под постом.
EXPLAIN, индексы, VACUUM, репликацию и мониторинг разбираем в курсе PostgreSQL, отказоустойчивый кластер — в курсе Patroni.