Индекс есть, а запрос его не использует
На таблице 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`
