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

Делал ли индекс сканирование плана запросов

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 систем.

Делал ли индекс сканирование плана запросов | PrepBro