Java 在MYSQL表中存储UUID的各种选项及其权衡是什么?

Java 在MYSQL表中存储UUID的各种选项及其权衡是什么?,java,mysql,jpa,uuid,Java,Mysql,Jpa,Uuid,我计划在MySQL数据库的几个表中使用客户端提供的UUID作为主键 我遇到过在MySQL数据库中存储UUID的各种机制,但没有任何机制可以相互比较。其中包括存储: 二进制(16) 字符(16) 查尔(36) 瓦尔查尔(36) 2 x BIGINT 是否有更好的选项,这些选项在以下方面如何相互比较: 存储容量 查询开销?(索引问题、联接等) 是否易于从客户端代码插入和更新值?(通常通过JPA使用Java) 根据您运行的MySQL版本或存储引擎,是否存在任何差异?我们目前正在运行5.1,并计

我计划在MySQL数据库的几个表中使用客户端提供的UUID作为主键

我遇到过在MySQL数据库中存储UUID的各种机制,但没有任何机制可以相互比较。其中包括存储:

  • 二进制(16)
  • 字符(16)
  • 查尔(36)
  • 瓦尔查尔(36)
  • 2 x BIGINT
是否有更好的选项,这些选项在以下方面如何相互比较:

  • 存储容量
  • 查询开销?(索引问题、联接等)
  • 是否易于从客户端代码插入和更新值?(通常通过JPA使用Java)

根据您运行的MySQL版本或存储引擎,是否存在任何差异?我们目前正在运行5.1,并计划使用InnoDB。我欢迎任何基于尝试使用UUID的实际经验的评论。谢谢。

如果您确实开始使用UUID,我会选择将其存储在二进制(16)列中。像2x bigint这样的东西管理起来相当麻烦。此外,我还听说有人将它们反转,因为同一台机器上的UUID的开始往往在开始时是相同的,而不同的部分在最后,因此如果你将它们反转,你的索引将更有效


当然,我的直觉告诉我,除非有很好的理由使用UUID,否则应该使用自动递增整数。一个很好的理由是跨不同的数据库生成唯一的密钥。另一个选项是,您计划拥有的记录比INT所能存储的要多。虽然不是很多应用程序真正需要这样的东西。在密钥中不使用整数不仅会损失很多效率,而且使用它们也会更加困难。它们太长,无法输入,在URL中传递它们会使URL非常长。因此,如果需要,可以使用UUID,但请尽量远离它。

我已经将UUID用于智能客户端在线/离线存储和数据同步,以及我知道在某个时候必须合并的数据库。我一直使用char(36)或char(32)(无破折号)。与varchar相比,您的性能略有提高,而且几乎所有数据库都支持char。我从未尝试过二进制或bigint。需要注意的一点是,如果不使用36或32个字符,char将填充空格。重点是,不要编写将对象ID设置为“test”的单元测试,然后尝试在数据库中查找它

出于好奇,为什么是客户端?从系统漏洞的角度来看,这让我有点担心。它不是一个web应用程序,只有受信任的客户端才能通过专用网络与后端集成。你怎么能存储为2xbigint,@BenM?也许我使用的MySQL版本与你不同,但如果你有一个char(32)字段,其中的值为“test”,您确实可以通过在查询中指定fieldname='test',甚至fieldname='test'的位置来找到它。因为它知道它在填充char值,所以它会找到匹配的内容,只要它们后面只跟空格。在Oracle中,我必须对字段调用trim(),否则它会比较“test”和“test”。对于大块插入/选择,重新填充二进制文件要快得多