В таблице orders есть индекс по status, но EXPLAIN для условия WHERE status IN ('paid','shipped') показывает Seq Scan. Какое объяснение наиболее правдоподобно, если эти статусы встречаются у большинства заказов?
AПланировщик ожидает, что в выборку попадёт много строк, и
Seq Scan будет дешевле множества случайных чтений по индексуBИндекс на колонке всегда игнорируется при использовании оператора
IN с двумя и более значениями в условииCПоявление
Seq Scan указывает на то, что таблица заблокирована другим запросом и индекс временно недоступенDИспользование
Seq Scan означает, что индекс физически повреждён и его нужно пересоздать перед следующим запросомПравильный ответ. Индекс не всегда выгоден: при выборке большой доли строк
Seq Scan дешевле случайных обращений по индексу.Разбор
Индекс эффективен, когда условие WHERE сильно сужает выборку. Если же фильтр пропускает большую долю строк, чтение через индекс превращается в множество случайных обращений к таблице и оказывается дороже последовательного сканирования. В этом случае планировщик выбирает Seq Scan, и это нормальное поведение, а не признак проблем. Утверждения про IN, блокировки и повреждение индекса — типичные мифы, не соответствующие тому, как принимается решение по плану.
Проверь себя · 1/3разбор после ответа
Есть индекс по
orders.created_at, но EXPLAIN для фильтра WHERE date(created_at) = current_date показывает Seq Scan. Почему это часто происходит?Ещё вопросы по теме «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 и оптимизация» →