tl; dr: Является ли назначение идентификаторов строк {unixtimestamp} {randomdigits} (например, 1308022796123456) как BIGINT хорошей идеей, если я не хочу иметь дело с UUID?
Просто интересно, есть ли у кого-нибудь представление о производительности или других технических соображениях/ограничениях в отношении идентификаторов /PRIMARY KEY, назначенных для записей базы данных на нескольких серверах.
Мое приложение PHP + MySQL работает на нескольких серверах, и данные должны быть объединены. Таким образом, я перерос стандартный метод последовательного/автоматического_инкремента для определения строк.
Мои исследования в решении привели меня к концепции использования UUID/GUID. Однако необходимость изменить мой код для работы с преобразованием строк UUID в двоичные значения в MySQL кажется немного болью/работой. Я не хочу хранить UUID как VARCHAR для хранения и повышения производительности.
Еще одна возможная досада UUID, хранящаяся в двоичном столбце, заключается в том, что идентификаторы строк не очевидны при просмотре данных в PhpMyAdmin - я мог ошибаться в этом, хотя, но прямые цифры кажутся намного проще в любом случае и являются универсальный для любой системы баз данных без необходимости преобразования.
В качестве промежуточного уровня я придумал идею создания идентификационных колонок BIGINT и назначение идентификаторов с использованием текущей временной отметки unix, а затем 6 случайных цифр. Так что скажем, что мое случайное число составило 123456, мой сгенерированный идентификатор сегодня выйдет как: 1308022796123456
Один из 10 миллионов шансов на конфликт для строк, созданных в течение одной секунды, отлично со мной. Я не делаю создания массового ряда быстро.
Одна проблема, которую я прочитал со случайно генерируемыми UUID, заключается в том, что они плохо относятся к индексам, поскольку значения не являются последовательными (они разбросаны повсюду). Функция UUID() в MySQL обращается к этому путем генерации первой части UUID с текущей временной метки. Поэтому я скопировал эту идею с отметкой unix в начале моего BIGINT. Будут ли мои индексы медленными?
Плюсы моей идеи BIGINT:
- Дает мне преимущества для нескольких серверов/слияния UUID.
- Требуется очень малое изменение кода приложения (все уже запрограммировано для обработки целых чисел для идентификаторов)
- Половина памяти UUID (8 байт против 16 байт)
Минусы:
- ??? - Пожалуйста, дайте мне знать, если вы можете думать о них.
Некоторые последующие вопросы, чтобы согласиться с этим:
-
Должен ли я использовать более или менее 6 случайных цифр в конце? Будет ли это иметь значение для производительности индекса?
-
Является ли один из этих методов "случайным"?: Получение PHP для генерации 6 цифр и объединения их вместе. - Получение PHP для генерации числа в диапазоне 1 - 999999, а затем zerofilling для обеспечения 6 цифр.
Спасибо за любые советы. Извините за стену текста.