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:

  1. 我应该在结尾使用多于或少于6个随机数字吗?这会对索引性能产生影响吗?

  2. 这些方法中有一种是"随机化者"吗让PHP生成6个数字并将它们连接在一起——与之相比,让PHP生成1-999999范围内的数字,然后进行零填充以确保6个数字.

谢谢你的提示.对文字墙的事我很抱歉.

推荐答案

我在职业生涯中遇到过这个问题.我们使用时间戳+随机数,当我们的应用程序向上扩展时遇到了严重的问题(更多的客户端、更多的服务器、更多的请求).诚然,我们(愚蠢地)只使用了4位数字,然后更改为6位,但您会惊讶于错误仍然发生的频率如此之高.

在足够长的一段时间内,你guaranteed岁就会出现重复的密钥错误.我们的应用程序是任务关键型的,因此,即使是由于固有的随机行为而导致它失败的最小可能性也是不可接受的.我们开始使用UUID来避免这个问题,并仔细管理它们的创建.

使用UUID,您的索引大小将增加,索引越大性能越差(可能不明显,但仍然很差).然而,MySQL支持原生UUID类型(千万不要将varchar用作主键!!),即使与bigint相比,MySQL也可以非常高效地处理索引、搜索等.对索引性能影响最大的几乎总是索引的行数,而不是要索引的项的大小(除非您想对长文本或类似荒谬的内容进行索引).

回答您的问题:如果您不打算显著扩展应用程序/服务,Bigint(附带随机数)就可以了.如果您的代码可以在不做太多更改的情况下处理更改,并且如果出现重复的密钥错误,您的应用程序也不会爆炸,那么就使用它.否则,咬紧牙关, Select 更实质性的选项.

您可以在以后实施更大的更改,比如切换到完全不同的后端(我们现在面临的是…:P)

Database相关问答推荐

找不到复制副本集

如何将对象源动态设置为子窗体

KUST查询指定时间跨度内里程表&值的差值,并将其滚动到0

从 GCP 机密管理器中读取 .DER 值并将其保存到 .DER 文件

SQL 查询至少其中一项

复合主键

有没有办法为 2 个具有不同包名称的应用程序提供 1 个 Firebase 数据库?

按纬度/经度进行半径搜索

Java中基于文件的数据库

Boyce-Codd 范式的良好 KISS 描述是什么?

Uniqueidentifier vs. IDENTITY vs. Material Code - 主键的最佳 Select 是哪个?

免费的便携式数据库有哪些?

本地数据库,我需要一些例子

如何使用 SQL 命令文件创建 SQLite3 数据库文件?

在 iphone 上本地存储数据

存储并仍然索引加密客户数据的最佳方式是什么?

MySQL:LAST_INSERT_ID() 返回 0

如何在 SQL Server 中生成并手动插入唯一标识符?

如何修复 Postgres 上过时的 postmaster.pid 文件?

以可能的数据丢失为代价提高 PostgreSQL 写入速度?