代码之家  ›  专栏  ›  技术社区  ›  BenM

在mysql表中存储uuid的各种选项及其权衡是什么?

  •  3
  • BenM  · 技术社区  · 15 年前

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

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

    • 二进制(16)
    • 字符(16)
    • 字符(36)
    • VARCHAR(36)
    • 2倍大

    是否有更好的选择,这些选择在以下方面如何相互比较:

    • 存储大小?
    • 查询开销?(索引问题、连接等)
    • 易于从客户端代码插入和更新值?(典型的JPA通过JPA)

    您运行的MySQL版本或存储引擎有什么不同吗?我们目前正在运行5.1,并计划使用InnoDB。我欢迎任何基于尝试使用UUID的实践经验的评论。谢谢。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Dan Polites    15 年前

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

        2
  •  3
  •   Kibbee    15 年前

    如果您确实设置了使用UUID,那么我将把它存储在二进制(16)列中。像2X Bigint这样的东西管理起来会很麻烦。另外,我也听说过有人反转它们,因为同一台机器上的UUID的开始在开始时是相同的,而不同的部分在结束时,所以如果反转它们,您的索引将更有效。

    当然,我的直觉告诉你应该使用自动递增整数,除非你有充分的理由使用uuid。一个很好的原因是在不同的数据库中生成唯一的键。另一种选择是,您计划拥有比int可以存储的记录更多的记录。虽然没有多少应用程序真正需要这样的东西。当不使用整数作为密钥时,不仅会损失很多效率,而且使用它们也会比较困难。它们太长,无法输入,在URL中传递它们会使URL非常长。所以,如果你需要的话,带上UUID,但是尽量远离它。