news 2026/4/25 17:50:58

数据库id生成方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据库id生成方案

数据库主键(id)的生成方案在设计系统时非常关键,既影响性能,也影响分布式扩展能力。下面给出5 种主流方案,并结合 Spring Boot + MyBatis + MySQL 项目,推荐最佳实践及示例代码。

🧩 一、常见主键生成方案对比

方案类型示例优点缺点适用场景
1. 自增主键(AUTO_INCREMENT)id BIGINT AUTO_INCREMENT简单、易用、顺序性好分布式环境易冲突、插入热点单节点系统、小型项目
2. UUID(字符串)id CHAR(36)全局唯一查询慢、存储冗余大无需排序的全局唯一标识
3. 雪花算法(Snowflake ID)long id = Snowflake.nextId();高性能、趋势递增实现复杂、时间依赖分布式系统
4. Redis / 数据库序列号从 Redis 或 DB 获取自增号全局唯一、可控有外部依赖多系统共享ID
5. 自定义混合ID(时间戳 + 随机数)例如20251025142312345可读性好可能重复(需控制)临时或日志型记录

✅ 二、推荐方案(Spring Boot + MyBatis + MySQL)

建议使用:

雪花算法(Snowflake ID) + MyBatis 自动生成主键

这样既:

  • 不依赖 MySQL 自增(可分库分表);
  • 不会发生 ID 冲突;
  • 效率极高;
  • ID 可作为时间序列排序。

✅ 三、实现方案(雪花算法版本)

1️⃣ 新建工具类SnowflakeIdGenerator.java

package com.example.qrcode.util; /** * 雪花算法ID生成器 * 64位ID结构如下: * 1bit 符号位 + 41bit 时间戳 + 10bit 机器ID + 12bit 序列号 */ public class SnowflakeIdGenerator { // 起始时间戳(自定义纪元) private static final long START_STAMP = 1672531200000L; // 2023-01-01 // 每部分占位 private static final long SEQUENCE_BIT = 12; // 序列号占12位 private static final long MACHINE_BIT = 10; // 机器ID占10位 // 最大值 private static final long MAX_MACHINE_NUM = ~(-1L << MACHINE_BIT); private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BIT); // 偏移量 private static final long MACHINE_LEFT = SEQUENCE_BIT; private static final long TIMESTAMP_LEFT = SEQUENCE_BIT + MACHINE_BIT; private long machineId; // 机器ID private long sequence = 0L; private long lastStamp = -1L; public SnowflakeIdGenerator(long machineId) { if (machineId > MAX_MACHINE_NUM || machineId < 0) { throw new IllegalArgumentException("机器ID超出范围"); } this.machineId = machineId; } // 获取下一个ID public synchronized long nextId() { long currStamp = System.currentTimeMillis(); if (currStamp < lastStamp) { throw new RuntimeException("时钟回拨,拒绝生成ID"); } if (currStamp == lastStamp) { sequence = (sequence + 1) & MAX_SEQUENCE; if (sequence == 0L) { currStamp = waitNextMillis(currStamp); } } else { sequence = 0L; } lastStamp = currStamp; return (currStamp - START_STAMP) << TIMESTAMP_LEFT // 时间部分 | (machineId << MACHINE_LEFT) // 机器部分 | sequence; // 序列部分 } private long waitNextMillis(long currStamp) { while (currStamp <= lastStamp) { currStamp = System.currentTimeMillis(); } return currStamp; } }

2️⃣ 在 Service 中使用

package com.example.qrcode.service; import com.example.qrcode.entity.QrCodeRecord; import com.example.qrcode.mapper.QrCodeMapper; import com.example.qrcode.util.QrCodeUtil; import com.example.qrcode.util.SnowflakeIdGenerator; import org.springframework.stereotype.Service; @Service public class QrCodeService { private final QrCodeMapper qrCodeMapper; private final SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1L); public QrCodeService(QrCodeMapper qrCodeMapper) { this.qrCodeMapper = qrCodeMapper; } public QrCodeRecord createAndSave(String content) throws Exception { byte[] imageBytes = QrCodeUtil.generateQrAsBytes(content, 300, 300); QrCodeRecord record = new QrCodeRecord(); record.setId(idGenerator.nextId()); record.setContent(content); record.setImage(imageBytes); qrCodeMapper.insert(record); return record; } }

3️⃣ 数据库表中改为手动ID插入

CREATE TABLE qr_code_record ( id BIGINT PRIMARY KEY COMMENT '雪花算法ID', content VARCHAR(500) NOT NULL, image LONGBLOB NOT NULL, created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

✅ 四、其他备选方案(简略)

🚀 1. MySQL 自增主键

id BIGINT PRIMARY KEY AUTO_INCREMENT

简单直接,适合单机。

🚀 2. UUID 方案

record.setId(UUID.randomUUID().toString());

表结构:

id CHAR(36) PRIMARY KEY

但效率不如 Long 型。

🚀 3. Redis 全局序列号

Long id = redisTemplate.opsForValue().increment("global:qr:id");

✅ 五、推荐结论

场景推荐方案
单体应用、小项目AUTO_INCREMENT
分布式系统、微服务雪花算法 (Snowflake)
跨系统全局唯一IDRedis 序列 或 UUID
临时或可读性强 ID时间戳 + 随机数拼接
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 15:23:40

法尔斯新闻社1398年波斯语新闻数据集_29万条_多领域分类_完整文本内容_自然语言处理_文本挖掘_机器学习训练数据_波斯语文本分类、主题建模、情感分析、命名实体识别、摘要生成等自然语言处理任务的研究

法尔斯新闻社1398年波斯语新闻数据集 引言与背景 法尔斯新闻社1398年波斯语新闻数据集是一个大规模、高质量的波斯语新闻文本数据集&#xff0c;收录了法尔斯新闻社在1398年&#xff08;即2019-2020年&#xff09;期间发布的全部新闻文章。该数据集包含294,023条新闻记录&…

作者头像 李华
网站建设 2026/4/24 22:41:58

基于MATLAB的三相方波逆变电路系统设计本设计包括设计报告(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于MATLAB的三相方波逆变电路系统设计本设计包括设计报告(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码基于MATLAB的三相方波逆变电路系统设计本设计包括设计报告 基于MATLAB的三相方波逆变电路系统设计本设计包括设计报告&…

作者头像 李华
网站建设 2026/4/25 3:50:54

好写作AI:当AI写作遇上“学术贫富差距”,我们是桥梁还是高墙?

顶尖高校的学生用AI一小时搞定文献综述&#xff0c;偏远地区的学生还在为知网卡顿发愁——这场面&#xff0c;像极了学术版的“数字鸿沟”真人秀。深夜&#xff0c;两间不同的宿舍里&#xff1a;一间的学生熟练地用AI分析着百篇外文文献&#xff0c;自动生成综述框架&#xff1…

作者头像 李华