Функция над колонкой в WHERE и неработающий индекс
На таблице users (около 3 млн строк) есть индекс по колонке email. Запрос авторизации всё равно работает медленно, в плане видно полное сканирование:
SELECT * FROM users WHERE LOWER(email) = 'ivan@example.com';
В чём причина и что делать?
- Планировщику не хватает статистики по таблице: после её обновления он переключится на индексный доступ без изменения самого запроса
- Индекс хранит исходные значения, а условие применяет функцию к колонке — нужен индекс по выражению LOWER(email)
- Проблема в SELECT *: после замены звёздочки на перечень колонок индекс будет использован
- Индексы по текстовым колонкам работают только с оператором LIKE, для равенства нужен другой тип индекса
