更新时间:2024-06-29 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
    CREATE TABLE mytable01(a INT, b INT) DISTRIBUTE BY hash(a);
    INSERT INTO mytable01 VALUES(1, 10);
    INSERT INTO mytable01 VALUES(1, 10);
    INSERT INTO mytable01 VALUES(1, 10);
    INSERT INTO mytable01 VALUES(1, 10);
    INSERT INTO mytable01 VALUES(1, 10);
    
    SELECT * FROM mytable01;
    

    1
    SELECT table_skewness('mytable01');
    

  2. UUID类型作为分布列。

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

    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE mytable02 (id UUID default uuid_generate_v1(), a INT, b INT) DISTRIBUTE BY hash(id);
    INSERT INTO mytable02(a, b) VALUES(1, 10);
    INSERT INTO mytable02(a, b) VALUES(1, 10);
    INSERT INTO mytable02(a, b) VALUES(1, 10);
    INSERT INTO mytable02(a, b) VALUES(1, 10);
    INSERT INTO mytable02(a, b) VALUES(1, 10);
    
    SELECT * FROM mytable02;
    

    1
    SELECT table_skewness('mytable02');