更新时间:2024-09-02 GMT+08:00

UUID函数

UUID函数表示可以用于生成UUID类型(请参考UUID类型)数据的函数。

uuid_generate_v1()

描述:生成一个UUID类型的序列号。

返回类型:UUID

示例:

1
2
3
4
5
SELECT uuid_generate_v1();
           uuid_generate_v1           
--------------------------------------
 c71ceaca-a175-11e9-a920-797ff7000001
(1 row)

uuid_generate_v1函数根据时间信息、集群节点编号和生成该序列的线程号生成UUID,该UUID在单个集群内是全局唯一的,但在多个集群间的时间信息、集群节点编号、线程号和时钟序列仍然存在同时相等的可能性,因此多个集群间生成的UUID仍然存在极低概率的重复风险。

uuid()

描述:生成一个UUID类型的序列号。此函数为MySQL兼容性函数,仅8.2.0及以上集群版本支持。

返回类型:UUID

示例:

1
2
3
4
5
SELECT uuid();
             uuid
----------------------------------
 6327dc96-f0e7-0100-f2f2-6c9ff700fffe
(1 row)

uuid函数内部生成原理同uuid_generate_v1()函数,即根据时间信息、集群节点编号和生成该序列的线程号生成UUID,该UUID在单个集群内是全局唯一的,但在多个集群间的时间信息、集群节点编号、线程号和时钟序列仍然存在同时相等的可能性,因此多个集群间生成的UUID仍然存在极低概率的重复风险。

sys_guid()

描述:生成Oracle的GUID序列号,类似UUID。此函数为Oracle兼容性函数。

返回类型:text

示例:

1
2
3
4
5
SELECT sys_guid();
             sys_guid             
----------------------------------
 4EBD3C74A17A11E9A1BF797FF7000001
(1 row)

sys_guid函数内部生成原理同uuid_generate_v1函数。

UUID函数应用示例

UUID全局唯一的特点,可以作为数据表生成主键,也可以作为数据表的分布列,uuid_generate_v1()作为数据表分布列的默认值时,通过Hash分布可以将数据均匀分布到各个DN上,防止数据倾斜。

UUID的显著优点就是全局唯一,不需要中心节点,单个节点独立生成。但是也存在缺点,UUID较INT占用更多的存储空间,索引效率低,生成的ID随机,没有递增的特性,所以辨识困难。因此,在应用中,要根据实际情况选择UUID还是Sequence作为数据表主键。

示例如下:

  1. INT类型作为分布列。
    创建示例哈希表mytable01,int类型作为分布列,插入数据后,查询数据存在数据倾斜。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    CREATE TABLE mytable01(a INT, b INT) DISTRIBUTE BY hash(a);
    CREATE TABLE
    INSERT INTO mytable01 VALUES(1, 10);
    INSERT 0 1
    INSERT INTO mytable01 VALUES(1, 10);
    INSERT 0 1
    INSERT INTO mytable01 VALUES(1, 10);
    INSERT 0 1
    INSERT INTO mytable01 VALUES(1, 10);
    INSERT 0 1
    INSERT INTO mytable01 VALUES(1, 10);
    INSERT 0 1
    SELECT * FROM mytable01;
     a | b
    ---+----
     1 | 10
     1 | 10
     1 | 10
     1 | 10
     1 | 10
    (5 rows)
    
    SELECT table_skewness('mytable01');
               table_skewness
    -------------------------------------
     ("dn_6003_6004        ",5,100.000%)
     ("dn_6001_6002        ",0,0.000%)
     ("dn_6005_6006        ",0,0.000%)
    (3 rows)
    
  2. UUID类型作为分布列。

    创建示例哈希表mytable02,UUID类型作为分布列,插入数据后,查询数据分布正常。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    CREATE TABLE mytable02 (id UUID default uuid_generate_v1(), a INT, b INT) DISTRIBUTE BY hash(id);
    CREATE TABLE
    
    INSERT INTO mytable02(a, b) VALUES(1, 10);
    INSERT 0 1
    INSERT INTO mytable02(a, b) VALUES(1, 10);
    INSERT 0 1
    INSERT INTO mytable02(a, b) VALUES(1, 10);
    INSERT 0 1
    INSERT INTO mytable02(a, b) VALUES(1, 10);
    INSERT 0 1
    INSERT INTO mytable02(a, b) VALUES(1, 10);
    INSERT 0 1
    
    SELECT * FROM mytable02;
                      id                  | a | b
    --------------------------------------+---+----
     63e45c14-cc74-0e00-e9aa-0a2c3fa0fffe | 1 | 10
     63e45c1f-4d18-0700-e9ab-0a2c3fa0fffe | 1 | 10
     63e45c26-f859-0b00-e9ad-0a2c3fa0fffe | 1 | 10
     63e45c23-9e5d-0300-e9ac-0a2c3fa0fffe | 1 | 10
     63e45c2a-5825-0600-e9ae-0a2c3fa0fffe | 1 | 10
    (5 rows)
    
    SELECT table_skewness('mytable02');
               table_skewness
    ------------------------------------
     ("dn_6001_6002        ",3,60.000%)
     ("dn_6003_6004        ",2,40.000%)
     ("dn_6005_6006        ",0,0.000%)
    (3 rows)