В таблице orders есть индекс по status, но EXPLAIN для условия WHERE status IN ('paid','shipped') показывает Seq Scan. Какое объяснение наиболее правдоподобно, если эти статусы встречаются у большинства заказов?

AПланировщик ожидает, что нужно прочитать слишком много строк, и Seq Scan будет дешевле, чем множество обращений к индексу.
BИндекс всегда игнорируется, если в условии используется IN.
CSeq Scan означает, что таблица orders заблокирована другим запросом.
DЭто гарантированный признак повреждения индекса.
Правильный ответ. Индекс не всегда выгоден, когда отбирается большая часть таблицы.

Разбор

Индекс помогает, когда условие WHERE сильно сужает выборку. Если фильтр пропускает большую долю строк, чтение через индекс может превратиться в множество «случайных» чтений таблицы и быть дороже. Тогда планировщик выбирает Seq Scan, и это может быть нормальным.

Проверь себя · 1/3разбор после ответа
Есть индекс по orders.created_at, но EXPLAIN для фильтра WHERE date(created_at) = current_date показывает Seq Scan. Почему это часто происходит?
Тренировать SQL в Telegram

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