2016-04-15 144 views
0

由于某些原因,在存入数据库之前需要获得UUID。类java.util.UUID可用于此。但是将这个生成的id用作数据库中的主键还是安全的,或者uuid只能由db生成?是否安全使用java来生成UUID主键?

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

+0

在这种情况下定义安全 –

+0

定义'出于某种原因'。如果可能的话,让数据库定义自己唯一的密钥总是更好。 – EJP

+2

如果我是你,我会省下麻烦,只需打开自动增量。但是,是的,它应该是安全的。 – 4castle

回答

0

在UUID生成的地方,只要它们是唯一的,它确实不会有什么区别。 MySQL的内置UUID()函数没有什么特别之处。

但是,这个问题一般与UUID有关。在InnoDB中(这就是应该使用),主键是聚簇索引......这意味着行的物理存储是以主键顺序存储的......这意味着在考虑任何时间行时性能会受到影响没有以主键顺序插入到表中。你的表中会有大量的页面拆分和大量的碎片。而且,显然,如果您连续生成多个UUID,则显然它们不是词汇顺序的。

此外,特别是如果你存储一个UUID为36个字符的CHARVARCHAR那么你的加入将是36个字节的值,这给自己带来潜在的性能问题 - 相反与INT,这是唯一4个字节或BIGINT,即8个。外键约束检查也必须使用较大的值。

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

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

但是,要回答这个问题,UUID的生成方式或位置应该没有关系。事实上,UUID的动机之一就是它们应该是独一无二的,而不管其来源。

+0

感谢无论如何,对于没有解释的驾驶者反对票。这是“有用的”。 –