2016-08-27 5 views
0

Я хотел бы создать столбец (не PK), значение которого представляет собой уникальный идентификатор. Он не используется для целей шифрования или безопасности - строго для идентификации записи. Каждый раз, когда вставлена ​​новая запись, я хочу сгенерировать и сохранить этот уникальный идентификатор. Не уверен, что это актуально, но сейчас у меня 1 миллион записей и ожидайте ~ 3 миллиона за 2 года. Я использую веб-приложение в PHP.UUID Хранение как двоичное в MySQL

Первоначально предполагалось, что я бы назвал UUID() и сохранил его непосредственно как некоторый тип данных char, но я действительно хотел провести некоторое исследование и узнать о более эффективном/оптимизированном подходе. Я нашел здесь много замечательных статей, но мне сложно работать со всеми постами, потому что многие из них несколько старше, или не согласны с подходом, который в конечном итоге оставил меня в замешательстве. Я хотел спросить, может ли кто-нибудь более мудрый/опытный одолжить мне руку.

Я видел людей, связанных здесь на различных должностях и предложил реализовать вещи таким образом: https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/

, но я имею трудное время полностью зная, что делать после прочтения этой статьи. Упорядоченный UUID? Что я должен хранить? Я думаю, что, может быть, эта страница немного треклята над моей головой. Я хотел спросить, может ли кто-нибудь помочь прояснить некоторые из них для меня. В частности:

  1. Какой тип данных должен содержать мой столбец для хранения двоичных данных (представляющих мой UUID)?
  2. Какую функцию следует использовать для преобразования моего UUID в двоичное значение и из него?
  3. Не могли бы вы продвинуть или советовать кому-нибудь поделиться?

Большое спасибо!

+0

Вопросы 1 и 2 отвечают в разделе заключения связанного блога. Не знаю, что вы ожидаете от нас ответить. 3. – Shadow

ответ

1

Если вы вызываете MySQL UUID(), вы получаете вариант, который является примерно хронологическим. Итак, если вам нужно ссылаться на «последние» записи и игнорировать «старые» записи, то переупорядочение битов в UUID может обеспечить лучшую «локальность ссылок» (то есть лучшую производительность).

Версия 4 не предусматривает такой.

Вы можете превратить UUID из массивной строки с 36 символами в более компактный 16-байтовый (Q1) BINARY(16) по коду (Q2) в my UUID blog. В этом документе обсуждаются различные другие аспекты вашего вопроса. (Q3)

Указанная вами ссылка Percona дает некоторые ориентиры, доказывающие «выгоду».

3M uuids принимает 16 байт каждый = 48 МБ. Он громоздкий, но вряд ли может вызвать серьезные проблемы. Тем не менее, я рекомендую избегать uuids всякий раз, когда это целесообразно.

+0

Спасибо за ответ; Чтобы быть ясным, я хочу использовать UUID() и использовать UUID v1, а не v4.Я хочу сохранить это как BINARY (16), используя код, который вы предоставили для MariaDB (я предполагаю, что он будет работать точно так же, как MySQL?). Когда вы говорите 48 МБ, вы говорите, что все накладные расходы просто добавили 48 МБ на общую сумму диска? – NullHypothesis

+0

Этот комментарий здесь прекрасен «Если ваши SELECTs имеют тенденцию быть« недавними »uuids, то они тоже будут легко кэшироваться. Если, с другой стороны, ваши SELECT часто достигают старых uuids, они будут случайными, а не хорошо кэшированные. Тем не менее, улучшение INSERT поможет системе в целом ». Это именно то, что я ожидаю от своей системы! Благодаря! – NullHypothesis

+0

3M * 16 = 48 МБ; фактическое значение/фактическое изменение, вероятно, будет больше из-за накладных расходов, индексов и т. д. Даже если это 200 МБ, это значимо? –

0

Я использовал UUID v4 в недавнем проекте. Код для генерации UUID v4 можно найти здесь: PHP function to generate v4 UUID

Основное отличие состоит в том, что мы сжимали его до 22-байтного формата с учетом регистра. Этот подход также используется ElasticSearch.

Результирующие значения сохраняются просто как char (22).

+0

Благодарим за помощь :) – NullHypothesis

Смежные вопросы