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表批量添加字段一些示例代码

    Mysql表批量添加字段一些示例代码

    这篇文章主要给大家介绍了关于Mysql表批量添加字段的相关资料,在MySQL中可以使用ALTER TABLE语句来批量添加字段,下面这篇文章通过代码介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • 深入解析mysql中distinct的用法

    深入解析mysql中distinct的用法

    本文深入解析了MySQL中DISTINCT关键字的功能,包括其作用、原理及使用方法,DISTINCT用于去除重复记录,提高数据查询效率,文章通过实例展示了如何对单个或多个字段进行去重,并结合COUNT函数使用,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • MySQL的事务和视图使用及说明

    MySQL的事务和视图使用及说明

    事务是数据库中一组SQL语句,要么全部执行成功,要么全部不执行,事务的四个特征为原子性、一致性、持久性和隔离性,隔离性主要解决并发情况下可能出现的脏读、不可重复读和幻读问题,视图是一个虚拟表,根据其他表或视图的查询结果生成,视图可以创建、修改和删除
    2026-01-01
  • 关于MySQL将表中数据删除后多久空间会被释放出来

    关于MySQL将表中数据删除后多久空间会被释放出来

    MySQL删除数据后,空间不会立即释放给操作系统,而是会被标记为“可重用”,以供未来插入新数据时使用,只有满足特定条件时,空间才可能真正返还给操作系统,本文给大家介绍MySQL中将表中数据进行删除后多久空间会被释放出来,感兴趣的朋友一起看看吧
    2025-11-11
  • 两种方法实现mysql分组计数,范围汇总

    两种方法实现mysql分组计数,范围汇总

    这篇文章主要介绍了两种方法实现mysql分组计数,范围汇总,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • MySQL PHP语法浅析

    MySQL PHP语法浅析

    在本篇文章里小编给大家分享了关于MySQL PHP语法的相关知识点,需要的朋友们学习参考下。
    2019-02-02
  • mysqld_safe启动脚本源码阅读、分析

    mysqld_safe启动脚本源码阅读、分析

    这篇文章主要介绍了mysqld_safe启动脚本源码阅读、分析,mysqld_safe是一个带有安全特性的启动脚本,使用Shell语言编写,需要的朋友可以参考下
    2014-07-07
  • IDEA连接不上MySQL端口号占用的解决

    IDEA连接不上MySQL端口号占用的解决

    这篇文章主要介绍了IDEA连接不上MySQL端口号占用的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • mysql索引(覆盖索引,联合索引,索引下推)

    mysql索引(覆盖索引,联合索引,索引下推)

    这篇文章主要介绍了mysql索引(覆盖索引,联合索引,索引下推),文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • MySql数据库之alter表的SQL语句集合

    MySql数据库之alter表的SQL语句集合

    mysql之alter表的SQL语句集合,包括增加、修改、删除字段,重命名表,添加、删除主键等。本文给大家介绍MySql数据库之alter表的SQL语句集合,感兴趣的朋友一起学习吧
    2016-04-04

最新评论