在MySQL中使用UUID作为主键是否有意义?
除了手工查询的麻烦外,使用UUID而不是常规INT会有什么利弊?
答案 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
。