Индекс на 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
- Дело в одинарных кавычках в литерале: при параметризованном запросе индекс подхватится
