Task Livecoding SQL Add Index for Slow Query

51. Оптимизация запроса с помощью индексов #

Условие задачи:
📌 В приложении есть медленный запрос:

SELECT id, name
FROM users
WHERE name = 'Artem'
  AND create_date = '2024-10-28'
  AND status = 'ACTIVE';

Нужно определить, на какие колонки следует добавить индекс, чтобы ускорить выполнение запроса.

Спойлеры к решению
Подсказки
💡 Индексы работают эффективно, если фильтры в WHERE ограничивают результат.
💡 Наиболее эффективно — композитный индекс (multi-column index), соответствующий порядку фильтров.
💡 Порядок колонок в индексе имеет значение: от более “селективной” (редко повторяющейся) к менее.
💡 Можно проверить план выполнения через EXPLAIN.
Решение
-- ✅ Оптимальный вариант: создать составной индекс
CREATE INDEX idx_users_name_create_date_status
    ON users (name, create_date, status);

Почему так:

  • Запрос фильтрует сразу по трём полям.

  • Если name наиболее селективное (редко повторяется) — ставим его первым.

  • Если же, например, status всегда 'ACTIVE', а create_date равна сегодняшнему дню, то можно поменять порядок:

-- Альтернатива при иной селективности:
CREATE INDEX idx_users_status_create_date_name
    ON users (status, create_date, name);

Дополнительно:

  • Можно ограничить индекс только используемыми фильтрами:

    CREATE INDEX idx_users_name_create_date
        ON users (name, create_date);
    
  • Если запрос часто делает поиск только по name, можно добавить отдельный индекс:

    CREATE INDEX idx_users_name ON users(name);
    

Итог:
🚀 Добавляем композитный индекс по фильтруемым колонкам, порядок выбираем по частоте повторения значений.
Используем EXPLAIN ANALYZE для проверки, что оптимизатор реально применяет индекс.