MySQL UUID

2024年10月19日 MySQL UUID 极客笔记

MySQL UUID

UUID(Universally Unique Identifier)是按照RFC 4122规范指定的一种通用唯一标识符,它是一个128位长的值。它的设计方式能够根据空间和时间生成全球唯一的数字。如果我们连续调用两次UUID函数,我们将得到两个不同的值,即使它们是在两个没有连接的设备上执行的。

注意:尽管UUID()总是生成唯一的值,但它们是不可猜测或可预测的。这意味着它总是返回一个随机数。

UUID的结构

在MySQL中,UUID返回一个128位长的值。它以UTF8字符串的形式表示,由下面的格式组成: 五个十六进制数

aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
  • 第一个数字 是作为时间戳格式的一部分生成的,例如低位、中间位和高位。这里,高位包含UUID版本号。
  • 第四个数字 负责在时间戳值失去单调性时保持时间上的唯一性。
  • 第五个数字 表示IEEE 802节点号,它表示了空间上的唯一性。如果字母不可用,将替换为无法保证空间唯一性的随机数字。

以下是MySQL中UUID值的有效字符串格式,它是一个 由32位十六进制格式和四个连字符(-)组成的排列:

a2720191-1cc6-11eb-9a2c-107d1a24f935
185e6dfd-1cc8-11eb-9a2c-107d1a24f935

我们可以使用以下函数在MySQL中生成UUID值:

mysql> SELECT UUID();

以上函数返回与RFC 4122中描述的UUID版本1一致的UUID值。成功执行上述语句后,将生成如下UUID值:

MySQL UUID vs. AUTO_INCREMENT PRIMARY KEY

MySQL中的UUID是AUTO_INCREMENT PRIMARY KEY的一个很好的替代方案。以下是UUID优于AUTO_INCREMENT PRIMARY KEY的优点:

优点

使用UUID作为主键的优点如下:

  • MySQL中的UUID值在表、数据库和服务器之间是唯一的。这样我们就可以从分布在不同服务器上的不同数据库中合并行数据。
  • UUID值不提供关于我们数据的信息,这意味着很难猜测。因此,它在URL中使用是安全的。
  • UUID值可以离线生成,这意味着我们可以在任何地方生成它,而不需要与数据库服务器交换信息。
  • 它还简化了复制(应用程序中的逻辑)。例如,如果我们想要插入数据到父表和子表中,我们必须先将数据插入到父表中,获得生成的id,然后将记录填充到子表中。使用UUID,我们可以生成父表的主键值,并同时插入两个表的行。

缺点

除了优点,使用UUID作为主键还有以下缺点:

  • 如果我们在数据库中存储UUID(16字节)值,它占用的空间/存储比整数(4字节)或大整数(8字节)更多。
  • 它使调试更加困难。例如,我们可以想象将表达式WHERE id =’185e6dfd-1cc8-11eb-9a2c-107d1a24f935’替换为WHERE id = 5。
  • 由于无序的值和它们的大小,它还可能导致性能问题。

MySQL UUID解决方案

我们可以通过使用以下给定的函数在MySQL中解决这些问题。这些函数允许我们将UUID值以紧凑格式(BINARY)存储,并以可读的格式(VARCHAR)显示。这些函数的名称如下:

  • UUID_TO_BIN
  • BIN_TO_UUID
  • IS_UUID

注意:这些函数仅适用于MySQL版本8.0或更高版本。

UUID_TO_BIN() 函数用于将UUID值从可读的格式转换为紧凑格式,以便存储在数据库中。

BIN_TO_UUID() 函数用于将UUID从紧凑格式转换为可读格式以进行显示。

IS_UUID() 函数用于验证UUID的字符串格式。如果参数有效则返回1,对于无效参数返回0。如果参数为NULL,则返回NULL。

MySQL UUID示例

让我们通过一个例子来了解如何使用UUID。首先,我们将使用以下语句创建一个名为 employee 的新表:

CREATE TABLE employee (
    emp_id BINARY(16) PRIMARY KEY,
    name VARCHAR(255)
);

下一步,我们需要将值插入表中。此外,如果我们想要将UUID值添加到 emp_id列 中,我们必须使用UUID()和UUID_TO_BIN()函数,如下所示:

INSERT INTO employee (emp_id, name)
VALUES (UUID_TO_BIN(UUID()),'John Doe'),
      (UUID_TO_BIN(UUID()),'Johnny Dope'),
      (UUID_TO_BIN(UUID()),'Jason Gillespie');

现在,执行SELECT语句来验证插入的记录。

最后,我们将使用BIN_TO_UUID()函数来查询一个UUID列的数据,该函数将二进制格式转换为可读格式。查看下面的语句:

mysql> SELECT BIN_TO_UUID(emp_id) AS ID, name FROM employee;

我们将得到以下输出:

MySQL UUID vs UUID(short)

UUID()和UUID(short)都是MySQL中不同的函数。它们之间的基本区别在下面的比较表中讨论:

UUID UUID(short)
UUID是由RFC 4122指定的通用唯一标识符,是由五个十六进制数字表示的UTF8字符串,其长度为128位。 此函数生成一个短的通用唯一标识符,作为64位无符号整数,与UUID()函数生成的字符串格式的128位标识符不同。
它生成一个符合16字节版本1 UUID标准的值。版本1 UUID是服务器ID的位累加和、当前时间戳、几个字节和实用位的组合。 返回值包含服务器ID的位累加和、相当静态的时间组件和逐渐增加的24位整数。
在UUID中,服务器ID的长度为6字节,使得空间唯一。 在UUID(简短版)中,服务器ID只有一个字节,所以失去了空间的唯一性。

本文链接:http://so.lmcjl.com/news/15783/

展开阅读全文