← Назад к вопросам

Как найти причину замедления системы в базе данных

3.0 Senior🔥 151 комментариев
#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Диагностика замедления системы на уровне базы данных

Начальная диагностика

1. Метрики производительности БД

Первый шаг — собрать статистику о текущем состоянии:

-- PostgreSQL: просмотр активных запросов
SELECT pid, usename, application_name, query, query_start 
FROM pg_stat_activity 
WHERE state = 'active';

-- MySQL: список активных потоков
SHOW PROCESSLIST;

-- Oracle: активные сессии
SELECT * FROM v$session WHERE status = 'ACTIVE';

2. Медленные запросы (Query Log)

Это основной источник информации:

-- PostgreSQL: включить логирование медленных запросов
ALTER SYSTEM SET log_min_duration_statement = 1000;
SELECT pg_reload_conf();

-- MySQL
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;

Анализ медленных запросов

Использование EXPLAIN ANALYZE

EXPLAIN (ANALYZE, BUFFERS) 
SELECT u.id, u.name, COUNT(*) as posts_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.id, u.name;

Выходные параметры:

  • Seq Scan — полный перебор таблицы
  • Index Scan — использование индекса
  • Nested Loop — вложенный цикл
  • Buffers: сколько блоков из памяти vs диска

Частые проблемы

Проблема 1: Отсутствие индекса

-- Плохо: полный перебор
EXPLAIN SELECT * FROM orders WHERE customer_id = 123;

-- Решение
CREATE INDEX idx_orders_customer_id ON orders(customer_id);

Проблема 2: N+1 queries

// Плохо
List<User> users = userRepository.findAll();
for (User user : users) {
    List<Post> posts = postRepository.findByUserId(user.getId());
}

// Решение: JOIN или eager loading
SELECT u.*, p.* 
FROM users u
LEFT JOIN posts p ON u.id = p.user_id;

Проблема 3: Функции в WHERE

-- Плохо: индекс не используется
WHERE LOWER(customer_email) = 'john@example.com';

-- Хорошо
WHERE customer_email = 'john@example.com';

Проблема 4: Несоответствие типов

-- Плохо
WHERE user_id = '123';

-- Хорошо
WHERE user_id = 123;

Инструменты мониторинга

Встроенные:

  • PostgreSQL: pg_stat_statements, pgAdmin
  • MySQL: Performance Schema
  • Oracle: AWR

Внешние:

  • DataGrip, SolarWinds DPA, New Relic, Grafana

Java-уровень

# Логирование SQL
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG

Систематический подход

  1. Определить узкое место: именно ли БД виновата?
  2. Найти медленные запросы: включить slow query log
  3. Анализировать: EXPLAIN ANALYZE
  4. Оптимизировать: индексы, переписать запрос, кэширование
  5. Тестировать: измерить улучшение

Профилактика

  • Регулярно обновлять статистику: ANALYZE
  • Переиндексировать: REINDEX
  • Настроить автовакуум
  • Мониторить размер таблиц
  • Архивировать старые данные
Как найти причину замедления системы в базе данных | PrepBro