【发布时间】:2011-02-09 11:24:45
【问题描述】:
在 MySQL 中使用 UUID 作为主键有意义吗?
除了手动查询的麻烦之外,使用 UUID 代替常规 INT 的优缺点是什么?
【问题讨论】:
标签: mysql primary-key
在 MySQL 中使用 UUID 作为主键有意义吗?
除了手动查询的麻烦之外,使用 UUID 代替常规 INT 的优缺点是什么?
【问题讨论】:
标签: mysql primary-key
在我看来,如果我们谈论大型数据库(和大量插入),在 MySQL 中使用 UUID 作为主键是个坏主意。
MySQL 始终将主键创建为集群,并且没有关闭它的选项。
考虑到这一点,当您插入大量具有非顺序标识符 (UUID) 的记录时,数据库会变得碎片化,并且每次新插入都会花费更多时间。
建议:使用带有 GUID 的 PostgreSQL/MS-SQL/Oracle。对于 MySQL,使用整数 (bigints)。
【讨论】:
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, ....);
【讨论】:
INSERT 语句中,而不是让数据库生成它。
我能想到的优点是您的 ID 将是唯一的,不仅在您的表中,而且在数据库的所有其他表中。此外,它应该在世界上任何数据库的任何表中都是唯一的。
如果您的表语义需要该功能,请使用 UUID。否则,只需使用普通的 INT ID(更快、更容易处理、更小)。
【讨论】:
UUID 的缺点是体积较大,因此搜索速度较慢。很难为每个临时查询键入一个长的十六进制字符串。它解决了您可能没有的需求,即多服务器唯一性。
顺便说一句,INT(n) 在 MySQL 中始终是一个 32 位整数,(n) 参数与允许值的大小或范围无关。这只是一个显示宽度提示。
如果您需要一个值范围大于 32 位提供的整数,请使用 BIGINT。
【讨论】: