Индекс по email создан, но план показывает последовательное чтение таблицы
На стенде с четырьмя миллионами пользователей запрос выполняется несколько секунд. Индекс есть:
CREATE INDEX idx_users_email ON users (email);
EXPLAIN ANALYZE
SELECT id FROM users WHERE lower(email) = 'ivan@example.com';
В плане — последовательное чтение всей таблицы (Seq Scan).
Почему индекс не используется?
- Индекс ещё не достроен и не виден планировщику: нужно обновить статистику по таблице и повторить запрос
- Обычный индекс не подходит для проверки на равенство строк, для этого нужен индекс другого типа
- Функция над колонкой делает индекс по самой колонке неприменимым: нужен индекс по выражению lower(email) или сравнение без функции
- EXPLAIN ANALYZE выполняет запрос с отключёнными индексами, фактический план нужно смотреть другой командой
