Вступить в клуб →
средняявопросPostgreSQL, ORM и оптимизация запросов

Индекс на email есть, но запрос по-прежнему читает всю таблицу

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

CREATE INDEX users_email_idx ON users (email);

Поиск в приложении реализован без учёта регистра:

SELECT id FROM users WHERE lower(email) = 'ivan@example.com';

В плане по-прежнему Seq Scan. Почему индекс не используется?

  • Планировщик ещё не собрал статистику по новому индексу: поможет перезапуск базы или ANALYZE
  • Индекс построен по значениям колонки, а условие сравнивает результат функции lower(email)
  • Обычный btree-индекс не работает с текстовыми колонками, для строк нужен индекс типа GIN
  • Дело в одинарных кавычках в литерале: при параметризованном запросе индекс подхватится

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

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

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

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