tl;dr: Is assigning rows IDs of {unixtimestamp}{randomdigits} (such as 1308022796123456) as a BIGINT a good idea if I don't want to deal with UUIDs?
我只是想知道是否有人对分配给跨多个服务器的数据库记录的ID/主键的性能或其他技术注意事项/限制有一定的了解.
我的PHP+MySQL应用程序在多台服务器上运行,数据需要能够合并.因此,我已经超越了识别行的标准顺序/自动增量整数方法.
我对解决方案的研究使我产生了使用UUID/GUID的概念.然而,在MySQL中需要修改代码以处理将UUID字符串转换为二进制值的问题似乎有点麻烦/费力.出于存储和性能原因,我不想将UUID存储为VARCHAR.
存储在二进制列中的UUID的另一个可能的烦恼是,在查看PhpMyAdmin中的数据时,行ID并不明显-尽管我在这一点上可能是错误的-但总的来说,直接数字似乎简单得多,并且在任何类型的数据库系统中都是通用的,不需要转换.
作为中间方案,我提出了将ID列设置为BIGINT,并使用当前Unix时间戳后跟6个随机数字分配ID的 idea .假设我的随机数是123456,我今天生成的ID会是:1308022796123456
对于在同一秒内创建的行,发生冲突的可能性为10万分之一,这对我来说是可以接受的.我不会很快进行任何形式的群集行创建.
我读到的关于随机生成的UUID的一个问题是,它们不利于索引,因为值不是连续的(它们分散在各地).MySQL中的UUID()函数通过从当前时间戳生成UUID的第一部分来解决这个问题.因此,我复制了在BIGINT开始时使用unix时间戳的 idea .我的索引会变慢吗?
Pros of my BIGINT idea:个
- 给了我UUID的多服务器/合并优势
- 只需对我的应用程序代码进行很少的更改(所有内容都已编程为处理ID的整数)
- UUID存储空间的一半(8字节对16字节)
Cons:个
- ?-如果你能想到什么请告诉我.
Some follow up questions to go along with this:个
我应该在结尾使用多于或少于6个随机数字吗?这会对索引性能产生影响吗?
这些方法中有一种是"随机化者"吗让PHP生成6个数字并将它们连接在一起——与之相比,让PHP生成1-999999范围内的数字,然后进行零填充以确保6个数字.
谢谢你的提示.对文字墙的事我很抱歉.