Вступить в клуб →
средняявопросPostgreSQL, ORM и кэш Redis

Индекс есть, а запрос его не использует

На таблице users создан индекс:

CREATE INDEX idx_users_email ON users (email);

Поиск в админке идёт таким запросом и работает за 900 мс, в плане — Seq Scan:

SELECT id FROM users WHERE lower(email) = lower($1);

Почему индекс не работает и как это чинят?

  • Индекс нужно перестроить: после массовых вставок он теряет актуальность и не используется, пока не сделать `REINDEX`
  • Индекс хранит значения `email` как есть, а условие сравнивает `lower(email)` — нужен индекс по тому же выражению
  • Планировщик игнорирует индексы в запросах с параметрами вроде `$1`: значение нужно подставлять прямо в текст запроса
  • Проблема в том, что выбирается только `id`: покрывающий индекс обязан включать все колонки из `SELECT`

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

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

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

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