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

Что делает EXPLAIN в БД?

2.3 Middle🔥 141 комментариев
#Базы данных и SQL

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

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

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

EXPLAIN в базе данных

EXPLAIN — это команда, которая показывает план выполнения SQL-запроса без фактического его выполнения. Она помогает разработчикам и DBA оптимизировать медленные запросы.

Что делает EXPLAIN

EXPLAIN анализирует запрос и возвращает:

  • Как БД будет исполнять запрос (последовательность операций)
  • Какие индексы будут использованы (или не будут)
  • Примерное количество обработанных строк (rows)
  • Стоимость операции (cost в PostgreSQL)
  • Узкие места производительности

Синтаксис

EXPLAIN SELECT * FROM users WHERE id = 5;

Для подробного анализа используют флаги:

EXPLAIN ANALYZE SELECT * FROM users WHERE id = 5;
EXPLAIN (ANALYZE, BUFFERS, TIMING) SELECT * FROM orders WHERE user_id = 10;

Пример анализа

Предположим, есть медленный запрос:

SELECT users.name, COUNT(orders.id) as order_count
FROM users
LEFT JOIN orders ON users.id = orders.user_id
WHERE users.age > 25
GROUP BY users.id, users.name;

Результат EXPLAIN:

HashAggregate  (cost=250.50..350.75 rows=500 width=40)
  ->  Hash Left Join  (cost=50.00..200.50 rows=5000 width=32)
        Hash Cond: (orders.user_id = users.id)
        ->  Seq Scan on orders  (cost=0.00..100.00 rows=10000 width=8)
        ->  Hash  (cost=40.00..40.00 rows=500 width=24)
              ->  Seq Scan on users  (cost=0.00..40.00 rows=500 width=24)
                    Filter: (age > 25)

Что это значит:

  • Seq Scan on orders — полное сканирование таблицы orders (неэффективно!)
  • cost=0.00..100.00 — стоимость операции
  • rows=10000 — ожидается 10000 строк
  • Нет индексов на user_id в orders

Как интерпретировать результаты

  1. Seq Scan vs Index Scan — индекс ускорит запрос
  2. Cost значения — выше cost = медленнее
  3. Rows estimate — если сильно отличается от реальности, может быть проблема со статистикой
  4. Nested Loops — при большом количестве строк может быть узким местом

Оптимизация на основе EXPLAIN

Создание индекса для ускорения:

CREATE INDEX idx_orders_user_id ON orders(user_id);

EXPLAIN SELECT * FROM orders WHERE user_id = 10;

Теперь вместо Seq Scan будет Index Scan.

N+1 проблема в Java

// Плохо: N+1 запросы
List<User> users = userRepository.findAll();
for (User user : users) {
    List<Order> orders = orderRepository.findByUserId(user.getId());
}

// Хорошо: 1 запрос с JOIN
List<User> users = userRepository.findAllWithOrders();

Обновление статистики БД

ANALYZE users;

ANALYZE TABLE users;

Логирование SQL в Spring Boot

spring:
  jpa:
    show-sql: true
    properties:
      hibernate:
        format_sql: true
        use_sql_comments: true

Затем скопируй SQL в БД и запусти EXPLAIN.

Инструменты для анализа

  • pgAdmin — для PostgreSQL
  • DBeaver — универсальный инструмент
  • explain.depesz.com — онлайн-анализатор
  • MySQL Workbench — для MySQL

Практические советы

  1. Проверяй медленные запросы через EXPLAIN
  2. Используй EXPLAIN ANALYZE для реальных цифр
  3. Смотри на cost — высокая стоимость = нужна оптимизация
  4. Добавляй индексы на поля в WHERE, JOIN и ORDER BY
  5. Запрос медленнее 100ms — анализируй через EXPLAIN

Итог

EXPLAIN — это первый инструмент при оптимизации БД. Любой медленный запрос должен быть проанализирован. Это сэкономит часы отладки и улучшит производительность приложения в production.