В EXPLAIN вашего отчёта видно, что выполняется Sort по created_at на очень большом наборе строк. Какое действие чаще всего помогает уменьшить работу сортировки?
AДобавить
OFFSET 0 в начало выборки: это подсказка планировщику пропустить внутреннюю сортировку и сразу перейти к чтению страниц.BУбрать условие
WHERE из запроса: без фильтрации планировщик выбирает более эффективный путь и автоматически задействует индекс.CДобавить/использовать индекс, который соответствует
ORDER BY created_at, чтобы вместо Sort план мог читать строки упорядоченно (например, через Index Scan) или сократить набор до сортировки более селективным WHERE.DЗаменить
ORDER BY created_at на GROUP BY created_at: группировка выполняется на уровне хранилища и не требует отдельного шага сортировки в плане.Правильный ответ. Сортировка ускоряется, если база может получить строки уже в нужном порядке из индекса.
Разбор
Если план вынужден делать Sort по миллионам строк, это часто главный потребитель ресурсов. Индекс по полю из ORDER BY (или составной индекс под фильтр + порядок) позволяет избежать полной сортировки или существенно её удешевить. Альтернативно можно уменьшить вход в сортировку через более точный WHERE.
Проверь себя · 1/3разбор после ответа
На большой таблице
events запрос SELECT * FROM events ORDER BY created_at DESC LIMIT 100 неожиданно работает быстро. Какое объяснение наиболее вероятно при наличии индекса по created_at?Ещё вопросы по теме «EXPLAIN и оптимизация»
- Вы хотите добавить новый запрос в дашборд и боитесь, что он сильно нагрузит базу, потому что таблица `events` очень большая. Что дает запуск `EXPLAIN` для этого запроса?
- В выводе `EXPLAIN` вы видите узел `Seq Scan on orders`. Что это обычно означает?
- В плане `EXPLAIN` для запроса по пользователю вы видите `Index Scan using orders_user_id_idx on orders`. Какой вывод наиболее корректен?
- На большой таблице `events` запрос `SELECT * FROM events ORDER BY created_at DESC LIMIT 100` неожиданно работает быстро. Какое объяснение наиболее вероятно при наличии индекса по `created_at`?
- Есть индекс по `orders.created_at`, но `EXPLAIN` для фильтра `WHERE date(created_at) = current_date` показывает `Seq Scan`. Почему это часто происходит?
- Все вопросы по «EXPLAIN и оптимизация» →