Генерация случайного идентификатора при регистрации - производительность базы данных - PullRequest
0 голосов
/ 06 февраля 2010

Я делаю сайт, на котором у каждой учетной записи будет свой идентификатор. Но я не хотел увеличивать его, что означает:
ID = 1
ID = 2
...
ID = 1000

Я хочу иметь случайные идентификаторы:
ID = 2355
ID = 5647734
ID = 23532
...

(Причина в том, чтобы роботы не проверяли все профили учетных записей, просто увеличивая идентификатор в URL - и, возможно, по другой причине, но это не вопрос)
Но я беспокоюсь о производительности при регистрации.
Это будет примерно так:

while (RANDOM_ID не используется): генерировать новый RANDOM_ID

При создании нового идентификатора для новой учетной записи я буду запрашивать базу данных (MySQL), чтобы проверить, существует ли идентификатор для каждого поколения.
Есть ли лучшее решение для этого?
Есть ли недостаток в использовании случайных идентификаторов?

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 06 февраля 2010

Существует множество причин не делать этого:

  • Ваше решение, как написано, не является транзакционно-безопасным; две транзакции одновременно могут генерировать один и тот же «случайный» идентификатор.

  • Если вы сериализуете транзакцию для обеспечения ее безопасности, вы будете убивать производительность, потому что запрос будет держать каждую отдельную строку столкновения заблокированной, пока не найдет запасной идентификатор.

  • Использование случайного идентификатора в качестве первичного ключа приведет к фрагменту вашего кластерного индекса. Это достаточно плохо для uuids - весь смысл автоматически сгенерированного столбца идентификаторов заключается в том, что вы можете создать безопасную последовательность из него.

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

0 голосов
/ 06 февраля 2010

Да, вы можете использовать UUID, но оставьте поле auto_increment. Просто добавьте новое поле и установите его так: md5 (microtime (true) .rand ()) или любой другой метод, который вам нравится, и используйте этот уникальный ключ вдоль сайта, чтобы создавать ссылки вместо того, чтобы предоставлять первичный ключ в URL.

0 голосов
/ 06 февраля 2010

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

Я не знаю, какой язык вы используете, но для большинства языков должна быть библиотека или пример кода.

...