Когда вы действительно вынуждены использовать UUID как часть дизайна? - PullRequest
113 голосов
/ 01 апреля 2009

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

Может ли кто-нибудь привести пример, когда у вас нет выбора, кроме как использовать UUID? Из всех применений, которые я видел, я вижу альтернативный дизайн без UUID. Конечно, дизайн может быть немного сложнее, но, по крайней мере, он не имеет ненулевой вероятности отказа.

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

Ответы [ 16 ]

2 голосов
/ 08 сентября 2016

Мне не до конца говорят о вероятности столкновения. Меня не волнует столкновение. Я забочусь о производительности, хотя.

https://dba.stackexchange.com/a/119129/33649

UUID - это падение производительности для очень больших таблиц. (200К строк не "очень большой".)

Ваш # 3 действительно плох, когда набор символов - utf8 - CHAR (36) занимает 108 байт!

UUID (GUID) очень «случайны». Используя их как УНИКАЛЬНЫЕ или ПЕРВИЧНЫЙ ключ на больших столах очень неэффективен. Это из-за необходимость прыгать вокруг таблицы / индекса каждый раз, когда вы вставляете новый UUID или ВЫБРАТЬ по UUID. Когда таблица / индекс слишком велика для кеша (см. innodb_buffer_pool_size, который должен быть меньше, чем RAM, обычно 70%), «следующий» UUID может не кэшироваться, следовательно, медленный диск удар. Когда таблица / индекс в 20 раз больше кеша, только 1/20 (5%) попаданий кэшируются - вы привязаны к вводу / выводу.

Итак, не используйте UUID, если только

у вас есть "маленькие" таблицы, или они вам действительно нужны из-за генерации уникальные идентификаторы из разных мест (и не нашли другого пути сделать это). Подробнее о UUID: http://mysql.rjweb.org/doc.php/uuid (Это включает функции для преобразования между стандартными UUID с 36 символами и BINARY (16).)

Наличие как УНИКАЛЬНОГО AUTO_INCREMENT, так и УНИКАЛЬНОГО UUID в одном Стол пустой.

Когда происходит ВСТАВКА, все уникальные / первичные ключи должны быть проверены на дубликаты. Любой уникальный ключ достаточен для требования InnoDB иметь первичный ключ. BINARY (16) (16 байт) несколько громоздкий аргумент против создания ПК), но не так уж плохо. Объемность имеет значение, когда у вас есть дополнительные ключи. InnoDB молча взялся за ПК на конец каждого вторичного ключа. Основным уроком здесь является минимизировать количество вторичных ключей, особенно для очень больших столы. Для сравнения: INT UNSIGNED - 4 байта с диапазоном 0..4 млрд. BIGINT составляет 8 байтов.

1 голос
/ 05 декабря 2015

Тем, кто говорит, что UUID плохой дизайн, потому что они могут (с некоторой смехотворно малой вероятностью) столкнуться, в то время как ваши ключи, сгенерированные БД, не будут ... вы знаете вероятность человеческой ошибки, вызвавшей коллизию на вашей БД сгенерированные ключи из-за какой-то непредвиденной необходимости на FAR FAR FAR выше, чем вероятность коллизии UUID4. Мы знаем , что, если БД будет воссоздано, он снова начнет идентификаторы с 1, и сколько из нас должно было воссоздать таблицу, когда мы были уверены, что нам никогда не потребуется? Я бы положил свои деньги на безопасность UUID, когда что-то пошло не так с неизвестными неизвестными в любой день.

1 голос
/ 01 апреля 2009

При использовании алгоритма версии 1 кажется, что невозможно столкновение при ограничении, что с одного и того же MAC-адреса генерируется менее 10 UUID в миллисекунду

Концептуально, оригинал (версия 1) Схема генерации UUID должна была объединить версию UUID с MAC-адрес компьютера, на котором генерируя UUID, и с количество интервалов 100 наносекунд с момента принятия григорианского календарь на западе. На практике Фактический алгоритм более сложный. Эта схема была подвергнута критике в что оно недостаточно «непрозрачно»; это раскрывает как личность компьютер, который сгенерировал UUID и время, когда это произошло.

Кто-то поправит меня, если я неверно истолковал, как это работает

1 голос
/ 01 апреля 2009

На моей последней работе мы получали объекты от третьих лиц, которые были однозначно идентифицированы с помощью UUID. Я поместил в UUID-> таблицу поиска длинных целых чисел и использовал длинные целые числа в качестве моих первичных ключей, потому что это было намного быстрее в этом случае.

0 голосов
/ 01 августа 2018

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

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

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

Другое «очевидное» решение - это центральный орган, который заранее раздает блоки с уникальными номерами, что, по сути, и делает UUID V1, используя MAC-адрес генерирующей машины (через OUI IEEE). Но дублирующие MAC-адреса действительно случаются, потому что каждый центральный орган в конечном итоге облажается, поэтому на практике это гораздо более вероятно, чем коллизия UUID V4. К сожалению.

Лучший аргумент против использования UUID состоит в том, что они «слишком большие», но (значительно) меньшая схема неизбежно не сможет решить наиболее интересные проблемы; Размер UUID является неотъемлемым побочным эффектом их полезности при решении этих самых проблем.

Возможно, ваша проблема недостаточно велика, чтобы нуждаться в том, что предлагают UUID, и в этом случае не стесняйтесь использовать что-то другое. Но если ваша проблема неожиданно обостряется (а большинство так и делают), вы в конечном итоге переключитесь позже - и пните себя за то, что не использовали их в первую очередь. Зачем проектировать на провал, когда так же легко проектировать на успех?

0 голосов
/ 12 октября 2012

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

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

...