Вступить в клуб →
средняявопросPostgreSQL и Redis: запросы и кэш

Индекс по колонке не помогает запросу с функцией в условии

Индекс создан, но авторизация по-прежнему упирается в последовательное сканирование таблицы на 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` этой таблицы

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела