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