【问题标题】:Primary key in MySQL: INT(n) or UUID as varchar(36)MySQL 中的主键:INT(n) 或 UUID 作为 varchar(36)
【发布时间】:2011-02-09 11:24:45
【问题描述】:

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

除了手动查询的麻烦之外,使用 UUID 代替常规 INT 的优缺点是什么?

【问题讨论】:

    标签: mysql primary-key


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      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, ....);
      

      【讨论】:

      • 说的不错,没想到这个。即使我们谈论的是同时向两个或多个表添加某些内容,而不是单个表,这也是相关的。
      • 这是真的,但使用 UUID 的主要好处是您可以在任何地方创建它们。如果您在插入记录时需要 UUID,只需在客户端生成它,并将其显式包含在您的 INSERT 语句中,而不是让数据库生成它。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        UUID 的缺点是体积较大,因此搜索速度较慢。很难为每个临时查询键入一个长的十六进制字符串。它解决了您可能没有的需求,即多服务器唯一性。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          • 2012-03-11
          • 2021-11-12
          • 1970-01-01
          • 1970-01-01
          • 2011-08-10
          相关资源
          最近更新 更多