Стоит ли ставить индекс на поле почта для авторизации
Что проверяют
Отличаете ли вы индекс ради скорости от ограничения уникальности и помните ли, что почту сравнивают без учёта регистра. Вопрос выглядит простым, но по ответу видно, писали вы вход в систему сами или брали готовый.
Как отвечать
Да, ставить нужно, и почти всегда это уникальный индекс. Вход ищет ровно одну строку по точному совпадению, и без индекса каждая попытка это сканирование всей таблицы пользователей, включая попытки чужих ботов. Уникальность тут даже важнее скорости: она не даёт появиться двум учётным записям с одним адресом при гонке двух параллельных регистраций, которую проверка «а есть ли такой» в коде не ловит.
Второй обязательный пункт это регистр. Формально нечувствительна только часть адреса до собаки, но на практике почту считают нечувствительной целиком. Значит адрес либо нормализуют перед записью, приводя к нижнему регистру и обрезая пробелы, либо индексируют по выражению:
create unique index users_email_lower_idx on users (lower(email));и тогда в запросах пишут то же самое выражение, иначе индекс не применится.
Для питоновского стека добавьте, как это выглядит в моделях. Уникальность объявляется признаком поля, и указывать вдобавок отдельный флаг индексации не нужно: уникальное ограничение и так создаёт индекс, а дубль даст две структуры вместо одной. Саму нормализацию держат в одном месте, в слое сохранения, а не размазывают по обработчикам.
Где спотыкаются
Хранят адрес ровно так, как его ввели, и ищут точным сравнением. Человек регистрировался с заглавной буквы, входит со строчной и получает «пользователь не найден» при формально верных данных.
Второе: полагаются на проверку существования в коде вместо ограничения в базе. Между проверкой и вставкой проходит время, две одновременные регистрации создают две записи, и дальше вход становится неоднозначным.
Третье: решают, что таблица маленькая и индекс не нужен. Она растёт, а сканирование на каждую попытку входа это ещё и удобная точка для внешней нагрузки: неуспешный вход стоит серверу столько же, сколько успешный.