Уявіть: ваш інтернет-магазин навантажує базу, кожні 5 хвилин сторінки завантажуються по 10 секунд, а в пік продажів сайт лягає. Ви перевіряєте сервер — CPU вільний, пам'яті запас, а запити все одно повільні. Без моніторингу продуктивності БД ви шукаєте проблему наосліп. Ми налаштовуємо pg_stat_statements та slow query log, підключаємо Prometheus із Grafana — і ви бачите точні метрики: cache hit rate, лаг реплікації, найважчі запити. За 2 дні ви отримуєте дашборди, які в реальному часі показують, які запити гальмують систему. Це не разова перевірка — це постійний контроль.
Ми вже стикалися з ситуацією, коли один повільний JOIN через неправильний індекс з'їдав 40% часу бази. Після налаштування моніторингу клієнт знайшов і виправив проблему за годину. Економія на операційних витратах сягає 30% за рахунок зниження простоїв. Оцінимо ваш проект безкоштовно — напишіть нам.
Як pg_stat_statements допомагає виявити повільні запити?
Розширення pg_stat_statements накопичує статистику по кожному унікальному запиту: час виконання, кількість викликів, стандартне відхилення. Конфігурація мінімальна:
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 10000
pg_stat_statements.track = all
pg_stat_statements.track_utility = off
Після перезапуску створіть розширення та виконайте запит для пошуку проблем:
-- Топ за сумарним часом
SELECT left(query, 120) AS query, calls,
round(total_exec_time::numeric / 1000, 1) AS total_sec,
round(mean_exec_time::numeric, 1) AS avg_ms,
round(stddev_exec_time::numeric, 1) AS stddev_ms,
round(rows::numeric / nullif(calls, 0), 0) AS rows_per_call
FROM pg_stat_statements
WHERE dbid = (SELECT oid FROM pg_database WHERE datname = current_database())
AND calls > 10
ORDER BY total_exec_time DESC
LIMIT 20;
-- Запити з великим розкидом часу
SELECT left(query, 120) AS query, calls,
round(mean_exec_time::numeric, 1) AS avg_ms,
round(stddev_exec_time::numeric, 1) AS stddev_ms,
round(stddev_exec_time / nullif(mean_exec_time, 0) * 100, 1) AS cv_pct
FROM pg_stat_statements
WHERE calls > 100
ORDER BY cv_pct DESC
LIMIT 10;
На одному проекті ми виявили запит, який виконувався в середньому 2,3 секунди і займав 15% від загального часу БД. Після додавання індексу час впав до 15 мс — прискорення в 153 рази. pg_stat_statements documentation підтверджує, що це найшвидший спосіб отримати агреговану картину. У порівнянні з slow query log:
| Інструмент | Що дає | Швидкість аналізу | Глибина деталізації |
|---|---|---|---|
| pg_stat_statements | Зведення по всіх запитах | Секунди | Висока (агрегати) |
| slow query log | Кожен повільний запит із планом | Хвилини | Повна |
Разом вони в 3 рази швидше допомагають локалізувати вузьке місце, ніж ручний перегляд логів.
Приклад: як ми знайшли повільний JOIN
У production-системі клієнта join двох таблиць на 2 млн рядків виконувався 4.5 секунди через відсутність індексу по зовнішньому ключу. pg_stat_statements показав TTFB на запиті 4.2 сек, а slow query log вивів повний план. Додали індекс — час впав до 12 мс. Без моніторингу пошук зайняв би кілька днів.
Чому slow query log важливий для MySQL?
У MySQL вмикаємо slow query log з порогом 1 секунда та логуванням запитів без індексів:
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = ON
min_examined_row_limit = 1000
log_slow_rate_limit = 100
Типовий випадок: запит без індексу сканував 500 000 рядків, виконуючись 4,2 секунди. Після аналізу ми додали складений індекс, і час скоротився до 0,03 секунди — зниження на 99,3%. Аналізуємо через Percona Toolkit:
pt-query-digest --since="1h ago" --limit 20 --output report /var/log/mysql/slow.log
Це дає count, avg/max time та rows examined для кожного унікального запиту.
Метричний моніторинг: Prometheus + Grafana
Для PostgreSQL використовуємо postgres_exporter, для MySQL — mysqld_exporter. Конфігурація експортерів стандартна, налаштовується за годину. Ключові метрики та алерти:
| Метрика | Поріг алерту |
|---|---|
| Cache hit rate (PG) | < 99% |
| Активні з'єднання | > 80% від max_connections |
| Лаг реплікації | > 30 секунд |
| Slow queries count/min | зростаючий тренд |
Приклад правил алертингу:
groups:
- name: postgresql
rules:
- alert: PostgreSQLSlowQueries
expr: rate(pg_stat_statements_total_exec_time_seconds_total[5m]) > 10
for: 2m
- alert: PostgreSQLHighConnections
expr: pg_stat_activity_count > pg_settings_max_connections * 0.8
Ви можете імпортувати готові дашборди Grafana (ID 9628 для PostgreSQL, 7362 для MySQL).
Що входить у роботу з налаштування моніторингу БД?
Ми надаємо повний комплект документації: опис конфігурації доступів, інструкції з розгортання, керівництво з дій при спрацьовуванні алертів. Після впровадження ви отримуєте:
- Налаштовані експортери для PostgreSQL та MySQL.
- Дашборди Grafana з ключовими метриками (cache hit rate, лаг реплікації, топ запитів).
- Кастомні алерти з відправкою в Telegram або Slack.
- Навчання команди: як інтерпретувати метрики та реагувати на алерти.
- Щоденні звіти pgBadger по повільних запитах.
Це дозволяє вашій команді самостійно підтримувати продуктивність БД без зовнішньої допомоги. Вартість впровадження окупається за 2 місяці за рахунок скорочення простоїв. Отримайте консультацію — ми оцінимо ваш проект за 1 годину.
Які етапи включає налаштування моніторингу БД?
- Аналітика: збір поточних метрик, виявлення вузьких місць за логами та статистикою.
- Налаштування
pg_stat_statementsтаslow_query_logз оптимальними параметрами. - Деплой Prometheus експортерів (postgres_exporter, mysqld_exporter).
- Створення кастомних дашбордів Grafana з ключовими метриками cache hit rate, лагу реплікації, топ запитів.
- Налаштування алертів в Alertmanager з відправкою в Telegram/Slack.
- Інтеграція pgBadger для щоденних звітів та навчання команди.
- Документація з конфігурації та дій при спрацьовуванні алертів.
Які типові помилки допускають при налаштуванні моніторингу БД?
- Не вмикають
pg_stat_statements.track_utility = off— засмічують статистику службовими запитами. - Забувають налаштувати
log_line_prefixдля MySQL — втрачають контекст у slow log. - Використовують один дашборд для всіх баз — ігнорують специфіку реплікації та шардингу.
- Не встановлюють поріг alertmanager на burst — отримують спам при короткочасних сплесках.
Ми виправляємо ці помилки на етапі впровадження. Наші інженери мають 5+ років досвіду в адмініструванні PostgreSQL та MySQL, сертифіковані по Prometheus. Більше 10 проектів з оптимізації продуктивності БД гарантують результат. Після впровадження моніторингу клієнти економлять до 40% часу на діагностику та скорочують простої вдвічі. Замовте налаштування моніторингу БД — і ми виявимо вузькі місця за 2 дні.







