使用java生成UUID主键是否安全?

时间:2016-04-15 04:36:36

标签: java mysql database

出于某种原因,在存储到数据库之前需要获取UUID。可以使用类java.util.UUID。但是使用这个生成的id作为数据库中的主键是否安全,或者uuid应该仅由db生成?

注意 使用了实际的MySql,但我认为它不会影响问题答案。

1 个答案:

答案 0 :(得分:0)

只要它们是唯一的,生成UUID的位置确实不应该有任何区别。 MySQL的内置UUID()函数没有什么特别之处。

然而,问题在于UUID。在InnoDB中(你应该使用它),主键是聚簇索引...这意味着行以主键顺序物理存储...这意味着你有一个性能损失考虑任何时候行没有按主键顺序插入表中。您的表格中会有大量的页面拆分和大量碎片。

显然,如果你连续生成几个UUID,很明显它们不是词法上的顺序。

此外,特别是如果您将UUID存储为36个字符CHARVARCHAR,那么您的联接将使用36个字节的值,这会带来潜在的性能问题 - 相比之下使用INT,只有4个字节,或BIGINT,即8.外键约束检查也必须使用更大的值。

AUTO_INCREMENT主键解决了这两个问题,因为根据定义,行按主键顺序插入,而键由更少的字节组成,这意味着更好的连接性能。

表演会不会很糟糕?不,但它不是最佳的。

但是,要回答这个问题,UUID的生成方式和位置无关紧要。事实上,对于UUID来说,其中一个动机是它们应该是独一无二的,无论来源如何。