MySQL实现雪花Id函数
环境 MySQL5.7
简介
snowflake是Twitter开源的分布式ID生成算法,结果是64bit的Long类型的ID,有着全局唯一和有序递增的特点。
- 最高位是符号位,因为生成的 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();
测试是否重复
CALL TestSnowId();
到此这篇关于MySQL实现雪花Id函数的文章就介绍到这了,更多相关MySQL 雪花Id内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
解决 phpmyadmin #2002 无法登录 MySQL 服务器
我以前使用phpmyadmin都是很正常的,从来没有出现过问题。但是今天出现了提示#2002无法登陆到MYSQL服务器2012-04-04mysql添加索引方法详解(Navicat可视化加索引与sql语句加索引)
索引用来快速地寻找那些具有特定值的记录,如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录,表里面的记录数量越多,代价就越高,下面这篇文章主要给大家介绍了关于mysql添加索引的相关资料,需要的朋友可以参考下2022-11-11Linux下安装mysql-5.6.12-linux-glibc2.5-x86_64.tar.gz
这篇文章主要介绍了Linux下安装mysql-5.6.12-linux-glibc2.5-x86_64.tar.gz的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下2016-09-09IDEA链接MySQL报错08001和连接成功后不显示表的问题及解决方法
这篇文章主要介绍了IDEA链接MySQL报错08001和连接成功后不显示表的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-10-10
最新评论