Есть запрос SELECT * FROM events WHERE user_id = 42 ORDER BY created_at DESC LIMIT 50. Какой вариант индекса чаще всего помогает, чтобы избежать Sort и быстро получить первые строки?

AИндекс по (created_at): чтение строк уже в нужном порядке, фильтр по user_id после Index Scan
BИндекс по (user_id): фильтрует строки пользователя, далее Sort на 50 итоговых строках допустим
CИндекс по (user_id, created_at): Index Scan сразу в нужном порядке без отдельного шага Sort
DИндекс по (created_at, user_id): покрывает оба столбца, даёт Index Only Scan без таблицы
Правильный ответ. Составной индекс может одновременно поддержать фильтр и порядок сортировки.

Разбор

Когда запрос фильтрует по user_id и сортирует по created_at, составной индекс по (user_id, created_at) часто позволяет читать нужный диапазон уже упорядоченным. Тогда планировщик может выбрать Index Scan и применить Limit почти сразу, без отдельного шага Sort. Это типичный паттерн для «последние N событий пользователя».

Проверь себя · 1/3разбор после ответа
Как удобнее интерпретировать дерево EXPLAIN, чтобы понять, откуда берутся строки и где тратятся ресурсы запроса?
Тренировать SQL в Telegram

Ещё вопросы по теме «EXPLAIN и оптимизация»