MySQL生成雪花算法ID的实现示例

 更新时间:2026年05月09日 08:21:52   作者:honvin_  
本文展示了SQL实现雪花ID算法的两种方式,第一种直接计算方式通过位运算组合时间戳、机器ID和序列号;第二种创建了可复用的snowflake_id函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

简单sql版:

SELECT
  -- 1. 42位 毫秒级时间戳(高位):当前时间戳 *1000 转毫秒,左移22位留出后面空间
  FLOOR(UNIX_TIMESTAMP(NOW(3)) * 1000) << 22

  -- 2. 10位 机器ID(中间位):固定机器标识 c0WD7EOH,转为数字后左移12位
  | CRC32('c0WD7EOH') % 1024 << 12

  -- 3. 12位 序列号(低位):同一毫秒内的自增序列,这里用随机数模拟(真实场景用自增变量)
  | FLOOR(RAND() * 4096) AS id;

结果示例值:7458326199558728174

创建函数:

DROP FUNCTION IF EXISTS snowflake_id;
DELIMITER $$

CREATE FUNCTION snowflake_id(worker_name VARCHAR(50))
RETURNS BIGINT UNSIGNED
NO SQL
BEGIN
    DECLARE now_ms BIGINT UNSIGNED;
    DECLARE worker_id INT UNSIGNED;
    SET worker_id = CRC32(worker_name) % 1024;

    wait_loop: WHILE TRUE DO
        SET now_ms = FLOOR(UNIX_TIMESTAMP(NOW(3)) * 1000);

        SET @last_ms = IFNULL(@last_ms, now_ms);
        SET @seq = IFNULL(@seq, 0);

        -- 新毫秒 → 重置序列号
        IF now_ms <> @last_ms THEN
            SET @seq = 0;
            SET @last_ms = now_ms;
        END IF;

        -- 标准雪花:每毫秒 0~4095
        IF @seq <= 4095 THEN
            SET @seq = @seq + 1;
            LEAVE wait_loop;
        END IF;
    END WHILE wait_loop;

    RETURN (now_ms << 22) | (worker_id << 12) | @seq;
END$$

DELIMITER ;

使用:

# 参数为机器码,给个随机数就行,例:
SELECT snowflake_id('0bpb3rBC');

结果示例值:7458326199558728174

到此这篇关于MySQL生成雪花算法ID的实现示例的文章就介绍到这了,更多相关MySQL生成雪花算法ID内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql数据库中getshell的方式总结

    mysql数据库中getshell的方式总结

    MySQL版本大于5.0,MySQL 5.0版本以上会创建日志文件,我们通过修改日志文件的全局变量,就可以GetSHELL,下面这篇文章主要给大家介绍了关于mysql数据库中getshell的方式,需要的朋友可以参考下
    2022-07-07
  • MySQL如何根据日期筛选数据

    MySQL如何根据日期筛选数据

    在MySQL中,根据日期筛选数据时,需要解决日期格式不一致的问题,本文介绍了四种常见场景的解决方案:基本日期筛选、处理不同日期格式、使用日期函数筛选以及处理时间部分
    2026-01-01
  • 获取缺失主键表信息的MYSQL语句

    获取缺失主键表信息的MYSQL语句

    如何获取缺失主键表信息,想必有些朋友还是不会的吧,下面为大家介绍下,可以通过几条语句实现,感兴趣的朋友可以了解下
    2013-06-06
  • MySQL exists 和in 详解及区别

    MySQL exists 和in 详解及区别

    本文章向大家介绍MySQL exists 和in 使用方法以及他们之间的区别,需要的朋友可以参考下
    2017-01-01
  • MySQL 中定义和使用变量的方法

    MySQL 中定义和使用变量的方法

    MySQL 提供了多种类型的变量,以适应不同的应用场景,用户定义的变量适用于简单的会话内数据传递,局部变量适合在复杂的存储过程中使用,而会话变量则用于调整和优化数据库会话的行为,这篇文章主要介绍了MySQL 中定义和使用变量,需要的朋友可以参考下
    2024-04-04
  • Mysql定时数据库备份实现的保姆级教程

    Mysql定时数据库备份实现的保姆级教程

    数据备份本身主要是为了预防一些意外,例如服务器或者个人电脑的硬件故障、人为的错误操作等情况,这篇文章主要给大家介绍了Mysql定时数据库备份实现的保姆级教程,需要的朋友可以参考下
    2024-12-12
  • MySQL InnoDB锁机制之从Record到Next-Key的使用解读

    MySQL InnoDB锁机制之从Record到Next-Key的使用解读

    这篇文章详细介绍了InnoDB的锁机制,包括记录锁(RecordLock)、间隙锁(GapLock)和Next-KeyLock,以及它们的触发条件和作用,通过理解这些锁的机制,读者可以更好地解决MySQL中的性能问题、死锁问题和幻读问题
    2025-12-12
  • Window下如何恢复被删除的Mysql8.0.17 Root账户及密码

    Window下如何恢复被删除的Mysql8.0.17 Root账户及密码

    这篇文章主要介绍了Window下如何恢复被删除的Mysql8.0.17 Root账户及密码,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • MySQL密码策略管理插件validate_password用法详解

    MySQL密码策略管理插件validate_password用法详解

    自MySQL5.6起,引入validate_password插件,用于密码长度和强度管理,在MySQL8.0中,该插件通过服务器组件重新实现,插件默认不允许密码为用户名,可设定最小长度和强度等级,还可要求密码包含数字、大小写字母和特殊字符
    2024-11-11
  • Mysql中的CHECK约束特性详解

    Mysql中的CHECK约束特性详解

    这篇文章主要介绍了Mysql中的CHECK约束特性详解的相关资料,讲解的十分浅显易懂,这里推荐给大家,需要的朋友可以参考下
    2022-08-08

最新评论