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作为数据表主键。
示例如下:
- 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');
- 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');