Вы добавили индекс по created_at, ожидая ускорить SELECT * FROM orders ORDER BY created_at DESC LIMIT 50, но EXPLAIN всё равно показывает Seq Scan и Sort. Какой вывод самый безопасный?
AПланировщик считает текущий путь дешевле по оценкам
cost: проверять селективность, статистику и форму запроса через EXPLAINBПланировщик
Postgres игнорирует индекс по столбцу даты, если в запросе нет условия WHERE с фильтрацией строкCИндекс по полю
created_at применяется только при операциях записи, а на запросах чтения план идёт через Seq ScanDНаличие
LIMIT 50 в запросе блокирует использование индексов и переключает план на чтение всей таблицы через Seq ScanПравильный ответ. То, что индекс не выбран, не означает, что он бесполезен — это решение планировщика в конкретных условиях.
Разбор
Планировщик сравнивает альтернативы и выбирает то, что кажется дешевле по оценкам cost/rows. Индекс мог не подойти из‑за формы запроса, из‑за того, что нужно прочитать слишком много строк, или из‑за неактуальной статистики. EXPLAIN помогает увидеть факт: какой план выбран и где узлы Sort/Seq Scan, — а дальше уже искать причину и варианты переписывания запроса.
Проверь себя · 1/3разбор после ответа
В
EXPLAIN вашего отчёта видно, что выполняется Sort по created_at на очень большом наборе строк. Какое действие чаще всего помогает уменьшить работу сортировки?Ещё вопросы по теме «EXPLAIN и оптимизация»
- Вы хотите добавить новый запрос в дашборд и боитесь, что он сильно нагрузит базу, потому что таблица `events` очень большая. Что даёт запуск `EXPLAIN` для этого запроса?
- В выводе `EXPLAIN` вы видите узел `Seq Scan on orders`. Что это обычно означает в плане выполнения запроса?
- В плане `EXPLAIN` для запроса по пользователю вы видите проход по индексу `orders_user_id_idx` для таблицы заказов. Какой вывод наиболее корректен?
- На большой таблице `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 и оптимизация» →