网站首页 > 文章精选 正文
概述
主键ID的几种生成方式,一般有以下几种:
- 自增
- UUID
- 雪花算法
下面针对这3种主键ID生成方式,简单的介绍一下优缺点。
自增
1、优点:
- 简单、易用,无需额外的配置,数据库会自动生成主键ID。
- 自增id是有序的,所以查询数据时效率高。
2、缺点:
- 如果表中存在大量数据,会导致主键ID的空间不够用。
- 数据库迁移或多库多表的情况下,主键ID的生成可能会出现重复。
3、优化方案:
- 针对多主库(主从库也需同样设置),可以设置不同的初始值,步长可以根据库的数量设置。比如两个主库,主库1初始值1,主库2初始化值2,步长2,这样主库1的主键ID为1,3,5,主库2的主键ID为2,4,6,以此类推。
- 增加ID的空间长度,可以使用无符号整型。int类型最大值是2147483647,uint类型最大值是4294967295
- 在数据迁移或合并时,可以将自增ID与标识列做联合主键。比如:在多租户系统中,可以设置租户ID作为标识列,租户ID与自增ID联合作为主键。
UUID
1、优点:
- UUID保证了唯一性,不会出现重复的主键ID。
- 本地生成,代码非常简单
- 数据迁移、合并、主从库同步等操作时,不会出现主键ID的冲突。
2、缺点:
- UUID是无序的,查询效率低。
- UUID占用空间大,长度至少36个字符,就算去掉分隔符也有32个字符。
3、优化方案:
- 转换成16位字符串,减少占用空间
private static string GenerateShortGuid()
{
long i = 1;
foreach (byte b in Guid.NewGuid().ToByteArray())
{
i *= ((int)b + 1);
}
return string.Format("{0:x}", i - DateTime.Now.Ticks);
}
- 转换成19位的长整型,提高查询效率
private static long GenerateLongID()
{
byte[] buffer = Guid.NewGuid().ToByteArray();
return BitConverter.ToInt64(buffer, 0);
}
雪花算法
1、雪花算法原理:
- 时间戳(41位):占据ID的最高位,用于记录ID生成的时间。由于时间戳是毫秒级的,因此可以保证在单个节点上生成的ID是递增的。同时,时间戳也起到了区分不同节点生成ID的作用。
- 工作机器ID(10位):包括5位的数据中心ID和5位的机器ID。这部分用于标识生成ID的节点,确保不同节点生成的ID不会冲突。
- 序列号(12位):用于记录同一毫秒内生成的ID序号。由于序列号部分有12位,因此可以在同一毫秒内生成4096个不同的ID。
2、优点:
- 长整型ID,支持大数据量
- 根据时间戳有序生成,保证写入性能(因为插入数据时需要创建索引)
- 生成ID的速度快,满足高并发场景的需求
3、缺点:
- 依赖机器时钟,如果机器上时钟回拨,可能导致ID重复
- 单机上生成的ID是递增的,在分布式环境下,可能不是全局递增的
其它主键生成方式
- 利用redis原子操作INCR生成主键ID。
- 利用数据库维护流水号,根据一定的规则生成主键ID。比如:[业务编号]+[yyyyMMdd]+[流水号]
猜你喜欢
- 2025-05-10 Java手写一个bitmap(java手写代码)
- 2025-05-10 MySQL有哪些实现方式?何为插入,何为更新?
- 2025-05-10 自学 C++ 第 6 课 二维数组找最值
- 2025-05-10 斐波那契查找算法(斐波那契查找算法java)
- 2025-05-10 YARN 资源调度器 CapacityScheduler 原理
- 2025-05-10 8张图带你全面了解kafka的核心机制
- 2025-05-10 java数据类型的转换以及精度丢失(java中基本数据类型转换)
- 2025-05-10 C语言中用宏实现求两个数中的最大数
- 2025-05-10 异或的魅力!图解「数组中两个数的最大异或值」
- 2025-05-10 基础函数20例,案例解读,再不掌握就真的Out了
- 05-14TS,TypeScript,Windows环境下构建环境,安装、编译且运行
- 05-14TypeScript 也能开发AI应用了!
- 05-14搞懂 TypeScript 装饰器
- 05-14前端小哥哥:如何使用typescript开发实战项目?
- 05-14在 React 项目中,一般怎么处理错误?
- 05-14react19 常用状态管理
- 05-14Vue3开发极简入门(2):TypeScript定义对象类型
- 05-14C#与TypeScript语法深度对比
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)