51. Оптимизация запроса с помощью индексов #
Условие задачи:
📌 В приложении есть медленный запрос:
SELECT id, name
FROM users
WHERE name = 'Artem'
AND create_date = '2024-10-28'
AND status = 'ACTIVE';
Нужно определить, на какие колонки следует добавить индекс, чтобы ускорить выполнение запроса.
Спойлеры к решению
Подсказки
💡 Индексы работают эффективно, если фильтры в
💡 Наиболее эффективно — композитный индекс (multi-column index), соответствующий порядку фильтров.
💡 Порядок колонок в индексе имеет значение: от более “селективной” (редко повторяющейся) к менее.
💡 Можно проверить план выполнения через
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 для проверки, что оптимизатор реально применяет индекс.