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

Функция над колонкой в WHERE и неработающий индекс

На таблице users (около 3 млн строк) есть индекс по колонке email. Запрос авторизации всё равно работает медленно, в плане видно полное сканирование:

SELECT * FROM users WHERE LOWER(email) = 'ivan@example.com';

В чём причина и что делать?

  • Планировщику не хватает статистики по таблице: после её обновления он переключится на индексный доступ без изменения самого запроса
  • Индекс хранит исходные значения, а условие применяет функцию к колонке — нужен индекс по выражению LOWER(email)
  • Проблема в SELECT *: после замены звёздочки на перечень колонок индекс будет использован
  • Индексы по текстовым колонкам работают только с оператором LIKE, для равенства нужен другой тип индекса

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

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

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

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