Правильный способ индексировать столбец электронной почты в MySQL - PullRequest
0 голосов
/ 08 декабря 2018

Итак, я работаю над интернет-сервисом, и в моей базе данных есть таблица пользователей.Я хочу проиндексировать столбец электронной почты, но я столкнулся с проблемой индексации строк различной длины.

Так что я подумал о решении, я создал еще один столбец типа int и перед сохранением записи пользователя я преобразовал его / ее электронное письмо в сумму значений ascii символов электронного письма.Я создаю сумму только тогда, когда я знаю, что никто не использовал тот же адрес электронной почты в прошлом, так что нет никаких шансов, что эта строка будет такой же.

Но я подумал, что эта сумма все еще может совпадать с другими записями.Я хочу знать, какова вероятность того, что сумма будет одинаковой для разных писем.

Если это сработает, я легко могу индексировать столбец индекса.

Вот алгоритм, который я использую для преобразования почтыстрока в int.

String email="testing@test.com"; // Allowed characters: 0-9 A-B a-b + - . _

    int sum=0;

    for(int i=0;i<email.length();i++){
        int ch=(int)email.charAt(i);
        if(ch>47 && ch<58){
            sum+=ch;
        }else if(ch>96 && ch<123){
            sum+=ch;
        }else if(ch>64 && ch<91){
            sum+=ch;
        }else if(ch==43 || ch==45 || ch==46 || ch==95 || ch==64){
            sum+=ch;
        }else{
            sum=0;
            break;
        }
    }

    System.out.println(sum);

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Предполагая, что мы хотим проиндексировать адрес электронной почты, чтобы убедиться, что нет дублирующегося адреса электронной почты и, следовательно, пользователя, вы не можете использовать хеш или сумму, потому что у вас будет коллизия, когда.

Дажеесли это маловероятно - это не значит, что это не может произойти.А когда это происходит - тогда никто не знает, почему программное обеспечение не работает - для этого «конфликтующего пользователя» или, что еще хуже, пользователь может взять учетную запись.

Вот почему я настоятельно рекомендую поставить индекс базы данных.на адрес электронной почты, независимо от того, что.

Это просто и работает во всех случаях независимо.

Создание таблицы позволит избежать дубликатов и легко реализуемо (ключевое слово: "UNIQUE KEY"):

CREATE TABLE IF NOT EXISTS `test` (
  `email_address` varchar(250) COLLATE latin1_german2_ci NOT NULL,
  UNIQUE KEY `email_address` (`email_address`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;

Проверить, существует ли уже запись, также легко:

SELECT * FROM `test` WHERE email_address = "abc@google.com"

Согласно комментарию fyrye, использование выбранной сортировки (заканчивающейся на "ci"(без учета регистра) позволяет хранить с учетом регистра.Но мы не будем вставлять дубликаты адресов электронной почты, которые являются просто разными (верхний / нижний регистр).

Пример: таблица уже содержит запись с адресом электронной почты "AbCd@mysql.com", тогда

INSERT INTO `db1080787-1`.`test` (
`email_address`
)
VALUES (
'abCd@mysql.com'
)

приведет к

#1062 - Duplicate entry 'abCd@mysql.com' for key 'email_address
0 голосов
/ 08 декабря 2018

Я не вижу проблемы в индексации самого поля электронной почты.Это может быть даже частичный индекс, размер 10 или что-то похожее на него.

Сумма символов ascii приведет к множеству коллизий.Вам лучше было бы хэшировать электронную почту и хранить хэш в двоичном виде или даже как int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...