MySQL中的主键:INT(n)或UUID作为varchar(36)

时间:2010-04-18 21:10:17

标签: mysql primary-key

在MySQL中使用UUID作为主键是否有意义?

除了手工查询的麻烦外,使用UUID而不是常规INT会有什么利弊?

4 个答案:

答案 0 :(得分:7)

从我的观点来看,如果我们谈论大型数据库(以及大量插入),使用UUID作为MySQL中的主键是个坏主意。

MySQL始终将主键创建为群集,并且没有选项可以将其关闭。

考虑到这一点,当您插入大量带有非顺序标识符(UUID)的记录时,数据库会碎片化,每个新插入都会花费更多时间。

建议:使用带有GUID的PostgreSQL / MS-SQL / Oracle。对于MySQL使用整数(bigints)。

答案 1 :(得分:6)

UUID的主要缺点是,如果你想在之后回溯到记录以供进一步使用,你必须事先创建它们(即:在依赖的外键表中添加子记录):

INSERT INTO table (uuidfield, someotherfield) VALUES (uuid(), 'test'));

不会让您看到新的UUID值是什么,并且由于您没有使用常规的auto_incremented主键,因此您无法使用last_insert_id()来检索它。您必须分两步完成:

SELECT @newuid := uuid();
INSERT INTO table (uuidfield, someotherfield) VALUES (@newuid, 'test');
INSERT INTO childtable ..... VALUES (@newuid, ....);

答案 2 :(得分:4)

我能想到的PRO是,您的ID将是唯一的,不仅在您的表中,而且在数据库的每个其他表上。此外,它在世界上任何数据库的任何表中都应该是唯一的。

如果表语义需要该功能,则使用UUID。否则,只需使用普通的INT ID(更快,更容易处理,更小)。

答案 3 :(得分:4)

UUID的缺点是它更笨重,因此搜索速度稍慢。每个ad hoc查询都很难输入一个长十六进制字符串。它解决了您可能没有的需求,即多服务器唯一性。

顺便说一句,INT(n)在MySQL中始终是32位整数,(n)参数与允许值的大小或范围无关。它只是一个显示宽度提示。

如果您需要一个值大于32位的整数值,请使用BIGINT