tl;dr:如果我不想处理UUID,是否将行ID分配为{unixtimestamp} {randomdigits}(例如1308022796123456)作为BIGINT是一个好主意?
想知道是否有任何与在多个服务器上为数据库记录分配ID / PRIMARY KEY相关的性能或其他技术考虑/限制的见解。
我的PHP + MySQL应用程序在多个服务器上运行,数据需要能够合并。因此,我已经超越了标准的顺序/自动增量整数方法来标识行。
我的研究带我到使用UUID / GUID的概念。但是,需要修改我的代码以处理在MySQL中将UUID字符串转换为二进制值似乎有点麻烦/工作量大。出于存储和性能原因,我不想将UUID存储为VARCHAR。
存储在二进制列中的UUID的另一个可能烦恼是,在查看PhpMyAdmin中的数据时,行ID并不明显 - 尽管我可能是错的 - 但是直接数字在任何类型的数据库系统中似乎更简单,并且不需要转换。
作为一个折中方案,我想到了使用BIGINT使我的ID列,并使用当前Unix时间戳后跟6个随机数字分配ID。因此,假设我的随机数字为123456,今天生成的ID将为:1308022796123456
对于在同一秒内创建的行冲突的一千万分之一的机会对我来说还可以接受。我不会快速进行任何大量行的创建。
我读到的有关随机生成的UUID的一个问题是它们对索引不利,因为值不是按顺序排列的(它们遍布在各处)。 MySQL中的UUID()函数通过从当前时间戳生成UUID的第一部分来解决这个问题。因此,我复制了使用BIGINT开头的Unix时间戳的想法。我的索引会很慢吗?
我的BIGINT想法的优点:
- 给我UUID的多服务器/合并优势
- 对我的应用程序代码要求很少(已经编程处理ID整数)
- 相比UUID使用的存储空间减半(8个字节 vs 16个字节)
缺点:
- ??? - 如果您能想到,请告诉我。
以下是一些相关问题:
在结尾使用6个随机数字是否太多或太少? 这会影响索引性能吗?
这两种方法中哪一个更“随机”?:让PHP生成6位数字并将它们连接在一起-VS-让PHP生成1-999999范围内的数字,然后填充0以确保有6位数。
感谢任何提示。 对于长篇文字,表示抱歉。