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

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

Разбор

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

Проверь себя · 1/3разбор после ответа
Вы хотите добавить новый запрос в дашборд и боитесь, что он сильно нагрузит базу, потому что таблица events очень большая. Что дает запуск EXPLAIN для этого запроса?
Тренировать SQL в Telegram

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