为什么分布式数据库中不使用uuid作为主键?
分布式数据库当然也有主键的需求,但是为什么不直接使用uuid作为主键呢?作为曾经被这个问题困惑过的人,试着回答一下
1. UUID生成速率低下
Java的UUID依赖于SecureRandom.nextBytes方法,而SecureRandom又依赖于操作系统提供的随机数源,在Linux系统下,它的默认依赖是/dev/random,而这个源是阻塞的。最可怕的是,这个nextBytes方法还是一个synchronized方法,也就是说,如果多线程调用UUID,生成速率不升反降。
测试结果:在一台64线程的服务器上,调用UUID.randomUUID方法,生成一千万个uuid平均耗时在130s,tps不到8w
2. UUID主键在innodb中会引发性能问题
a. innodb中的主键索引也是聚集索引,如果插入的数据是顺序的,那么b+树的叶子基本都是满的,缓存也可以很好的发挥作用。如果插入的数据是完全无序的,那么叶子节点会频繁分裂,缓存也基本无效了。这会减少tps
b. uuid占用的空间较大
3. UUID完全没有意义,如果有一个主键是全局自增的,那么数据排列顺序就是数据的插入顺序
解决方案:
1. 分布式全局序列生成(使用zk的DistributedAtomicLong,一次自增一个步长,用户用完了步长内的序列,再找zk要)
2. Twitter的snowflake算法
当然自增序列也不是完美的,因为在极大并发的情况下,按自增主键插入会发生争用,主键的上界会出现热点。但总的来说,还是可以接受的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!