← Назад к вопросам
Делал ли индекс сканирование плана запросов
2.0 Middle🔥 111 комментариев
#Базы данных (SQL)
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Анализ индексов при оптимизации SQL запросов
Да, я неоднократно работал с анализом планов запросов и оптимизацией индексов. Это критически важная часть разработки высоконагруженных приложений.
Как анализировать план запроса
Для анализа плана запроса в PostgreSQL или MySQL используется команда EXPLAIN:
# В контексте приложения на Python (SQLAlchemy)
from sqlalchemy import text, inspect
def analyze_query_plan(engine, query_string):
with engine.connect() as conn:
# PostgreSQL
result = conn.execute(text(f"EXPLAIN ANALYZE {query_string}"))
for row in result:
print(row[0])
Типичный вывод EXPLAIN ANALYZE:
- Seq Scan — полное сканирование таблицы (избегать на больших данных)
- Index Scan — поиск по индексу (желаемый результат)
- Index Only Scan — сканирование только индекса без доступа к таблице (оптимально)
- Bitmap Index Scan — комбинированный поиск по нескольким индексам
Пример оптимизации индекса
# ДО: медленный запрос с полным сканированием
SELECT * FROM users WHERE created_at > 2024-01-01 AND status = active;
# РЕШЕНИЕ: добавить составной индекс
CREATE INDEX idx_users_status_created
ON users(status, created_at DESC);
# ПРОВЕРКА: теперь используется Index Scan
EXPLAIN ANALYZE
SELECT * FROM users WHERE created_at > 2024-01-01 AND status = active;
Метрики плана запроса
В плане запроса ищу эти показатели:
- Planning Time — время на планирование (обычно < 1ms)
- Execution Time — время выполнения (чем меньше, тем лучше)
- Rows — ожидаемое vs реальное количество строк (если сильно отличаются, нужна переанализация статистики)
- Buffers — количество прочитанных блоков памяти
Практические примеры из опыта
В одном из проектов оптимизировал запрос, который сканировал 2 миллиона строк:
# Было (Seq Scan на 2M rows, 15 сек):
SELECT * FROM orders WHERE customer_id = ? AND created_at > DATE_SUB(NOW(), INTERVAL 30 DAY);
# Стало (Index Scan, 50ms):
CREATE INDEX idx_orders_customer_date
ON orders(customer_id, created_at);
Разница — 300x ускорение. Это пример того, почему анализ планов критичен.
Когда нужен индекс сканирование
- Запрос содержит WHERE с колонками, которые часто фильтруются
- JOIN по внешним ключам (автоматически индексируются)
- ORDER BY или GROUP BY по колонкам
- Составные индексы для запросов с несколькими условиями
Инструменты для анализа
- PostgreSQL:
EXPLAIN ANALYZE,pg_stat_statements,auto_explain - MySQL:
EXPLAIN FORMAT=JSON,Performance Schema - Python:
django-debug-toolbar,SQLAlchemy echo=True
Регулярный анализ планов запросов — часть моей рутины по поддержке production систем.