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