MySQL 雪花Id函数

环境 MySQL5.7

简介

snowflake是Twitter开源的分布式ID生成算法,结果是64bit的Long类型的ID,有着全局唯一和有序递增的特点。

show

  • 最高位是符号位,因为生成的 ID 总是正数,始终为0,不可用。
  • 41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。
  • 10位的机器标识,10位的长度最多支持部署1024个节点。
  • 12位的计数序列号,序列号即一系列的自增ID,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。
    缺点也是有的,就是强依赖机器时钟,如果机器上时钟回拨,有可能会导致主键重复的问题。

雪花Id

脚本根据 github:https://github.com/yitter/IdGenerator/tree/master/SQL 的SQL Server 版移植而来

雪花Id脚本

CREATE FUNCTION `SnowId`() RETURNS bigint(20)
BEGIN
	
	DECLARE b_current_time BIGINT;
	DECLARE b_time_tick BIGINT;
	DECLARE i_work_id INT;
	DECLARE i_work_id_big_length INT;
	DECLARE i_seq_big_length INT;
	DECLARE f_random FLOAT;
	
	DECLARE b_res BIGINT;
	
	SET i_work_id = 1;
	SET i_work_id_big_length = 4;
	SET i_seq_big_length = 8;
	SET b_current_time = (REPLACE(UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3)),'.','')) + 0;
	SET b_time_tick = b_current_time - 1582136402000;
	SET f_random = RAND();
	
	SET b_res = b_time_tick * POWER(2, i_work_id_big_length + i_seq_big_length) + i_work_id * POWER(2, i_seq_big_length) + (5 + round((POWER(2, i_seq_big_length)-1) * f_random, 0));
	
	RETURN b_res;
END

测试脚本

创建一个名为TestSnowId存储过程
内容:
定义了一个int变量i默认为1;
创建了一个临时表temp_numbers用于存储生成的SnowId;
循环5000次,并将SnowId添加到temp_numbers表内;
查询temp_numbers表内数据;
删除临时表;

CREATE PROCEDURE `TestSnowId` () 
BEGIN
	DECLARE i INT DEFAULT 1;
	CREATE TEMPORARY TABLE IF NOT EXISTS temp_numbers ( number BIGINT );
	WHILE i <= 5000 DO
	    INSERT INTO temp_numbers ( number ) VALUES (SnowId ());
		SET i = i + 1;
	END WHILE;
	SELECT * FROM temp_numbers;
	DROP TEMPORARY TABLE IF EXISTS temp_numbers;
END

使用

调用语句

SELECT SnowId();

getSnowId

测试是否重复

CALL TestSnowId();

test

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中没有内置的雪花算法函数雪花算法是一种用于生成分布式系统中唯一ID的算法,通常用于替代自增ID。如果你希望在MySQL中使用雪花算法生成唯一ID,你可以自己实现一个函数或者使用第三方库。 下面是一个简单的示例,演示如何在MySQL中实现雪花算法函数: ```sql CREATE FUNCTION snowflake() RETURNS BIGINT BEGIN DECLARE timestamp_ms BIGINT; DECLARE timestamp_seq BIGINT; DECLARE worker_id BIGINT; DECLARE datacenter_id BIGINT; DECLARE snowflake_id BIGINT; SET timestamp_ms = FLOOR(UNIX_TIMESTAMP(CURRENT_TIMESTAMP(6)) * 1000); SET timestamp_seq = (SELECT IFNULL(MAX(seq), 0) + 1 FROM snowflake_table WHERE timestamp = timestamp_ms); SET worker_id = <YOUR_WORKER_ID>; -- 需要根据实际情况设置 SET datacenter_id = <YOUR_DATACENTER_ID>; -- 需要根据实际情况设置 SET snowflake_id = (timestamp_ms << 22) | (datacenter_id << 17) | (worker_id << 12) | timestamp_seq; INSERT INTO snowflake_table (timestamp, seq) VALUES (timestamp_ms, timestamp_seq); RETURN snowflake_id; END; ``` 这个示例中,我们创建了一个名为`snowflake`的函数,它会生成一个唯一的雪花ID。你需要根据实际情况设置`worker_id`和`datacenter_id`,并且还需要创建一个名为`snowflake_table`的表来保存每个时间戳对应的序列号。 请注意,这只是一个简单的示例,实际应用中可能需要根据具体需求进行调整和优化。此外,还有一些第三方库可以帮助你更方便地在MySQL中实现雪花算法,你可以根据自己的需求选择合适的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值