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

mvb*_*fst 5 mysql primary-key

将UUID用作MySQL中的主键是否有意义?

除了手工查询的麻烦之外,使用UUID而不是常规INT有什么优缺点?

Ros*_*siv 8

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

MySQL总是将主键创建为群集,并且没有选项可以将其关闭.

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

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


Mar*_*c B 6

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

INSERT INTO table (uuidfield, someotherfield) VALUES (uuid(), 'test'));
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这是事实,但使用UUID的主要好处是可以在任何地方创建它们.如果在插入记录时需要UUID,只需在客户端生成它,并将其显式包含在`INSERT`语句中,而不是让数据库生成它. (4认同)

Pab*_*ruz 5

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

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