Вариант A:
SELECT *
FROM users
WHERE email = ?
Вариант B:
SELECT *
FROM users
WHERE LOWER(email) = LOWER(?)
Какой запрос отправится в прод?
Многие выбирают B, потому что он выглядит надёжнее. Пользователь может ввести
John@Example.com, а в базе лежит john@example.com.Но есть нюанс.
В большинстве СУБД вызов
LOWER() над колонкой ломает использование обычного индекса. Вместо быстрого Index Seek база часто уходит в полный скан таблицы.На 100 строках разницы не видно.
На 10 миллионах пользователей разница становится очень заметной.
Поэтому в проде обычно используют один из вариантов:
• хранить email в нормализованном виде (например, всегда lowercase);
• использовать case-insensitive collation;
• создать функциональный индекс на
LOWER(email).Самая опасная часть запроса часто выглядит как самая безобидная.
👉 Java Portal
