Комментарии (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
Как интерпретировать результаты
- Seq Scan vs Index Scan — индекс ускорит запрос
- Cost значения — выше cost = медленнее
- Rows estimate — если сильно отличается от реальности, может быть проблема со статистикой
- 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
Практические советы
- Проверяй медленные запросы через EXPLAIN
- Используй EXPLAIN ANALYZE для реальных цифр
- Смотри на cost — высокая стоимость = нужна оптимизация
- Добавляй индексы на поля в WHERE, JOIN и ORDER BY
- Запрос медленнее 100ms — анализируй через EXPLAIN
Итог
EXPLAIN — это первый инструмент при оптимизации БД. Любой медленный запрос должен быть проанализирован. Это сэкономит часы отладки и улучшит производительность приложения в production.