24. Query Optimization: EXPLAIN
EXPLAIN показывает план выполнения запроса.
Базовое использование
Заголовок раздела «Базовое использование»EXPLAIN ANALYZE (реальное выполнение)
Заголовок раздела «EXPLAIN ANALYZE (реальное выполнение)»EXPLAIN ANALYZESELECT u.username, COUNT(p.id) as post_countFROM users uLEFT JOIN posts p ON u.id = p.user_idGROUP BY u.id, u.username;Ключевые понятия
Заголовок раздела «Ключевые понятия»- Seq Scan: Полное сканирование таблицы (медленно!)
- Index Scan: Использует индекс (быстро)
- Nested Loop: JOIN через вложенный цикл
- Hash Join: JOIN через хеш-таблицу
- Cost: Оценка стоимости (относительная)
- Rows: Ожидаемое количество строк
Пример анализа
Заголовок раздела «Пример анализа»EXPLAIN ANALYZESELECT * FROM orders WHERE status = 'pending';
-- Результат:Seq Scan on orders (cost=0.00..1523.00 rows=150 width=128) (actual time=0.045..12.389 rows=142 loops=1) Filter: (status = 'pending'::text) Rows Removed by Filter: 9858Planning Time: 0.123 msExecution Time: 12.456 msПроблема: Seq Scan! Нужен индекс.
CREATE INDEX idx_orders_status ON orders(status);
-- Теперь:Index Scan using idx_orders_status on orders (cost=0.29..8.31 rows=142 width=128) (actual time=0.021..0.089 rows=142 loops=1)Следующий урок: Index Strategies →