Seq Scan на пяти миллионах строк в EXPLAIN
Ручка логина стала отвечать за 700 мс. EXPLAIN ANALYZE на запросе показывает:
EXPLAIN ANALYZE SELECT id, password_hash FROM users WHERE email = 'ivan@example.com';
-- Seq Scan on users (cost=0.00..98431.00 rows=1 width=48) (actual time=612.4..612.4 rows=1 loops=1)
-- Filter: (email = 'ivan@example.com'::text)
-- Rows Removed by Filter: 4999999
Что это значит и какое первое действие уместно?
- База перебирает всю таблицу построчно: по колонке `email` нет индекса, его нужно добавить
- Не хватает оперативной памяти под кэш страниц, нужно увеличить ресурсы контейнера с базой
- Запрос возвращает слишком много колонок; нужно выбрать только `id` и делать второй запрос за хэшем
- Проблема в типе колонки: сравнение строк в PostgreSQL всегда идёт последовательным перебором
