【MYSQL分布式环境问题】为什么不能使用自增ID或UUID做主键?

为什么不能使用自增ID或UUID做主键?

在Mysql的分布式环境中,为什么不推荐使用自增主键?

'id' INT(10) NOT NULL AUTO_INCREMENT

单库情况下做主键是没有问题的,但分布式情况下就会存在问题。

负载均衡问题:

在这里插入图片描述

其中A库中的id用完之后才会使用B库,此时C库是闲置的,造成资源空置问题。

性能损耗问题:

在这里插入图片描述

资源同步过程中需要加锁进行处理,自带id会损耗性能。

id冲突:

在这里插入图片描述

每个数据库都维护自己的id,例如:当三个库都从1,2,3…开始,就会出现数据冲突的问题(都出现id=1的情况)。

UUID可以用来做主键吗?会存在什么问题?

因为数据库底层是B+树结构:
在这里插入图片描述

底层通过页为大小进行存储数据的,并且B+树是排好序的,而对于uuid的生成并不是有序的,这样在插入数据时就可能会造成频繁的数据移动问题,从而严重影响性能。

但在Mysql8.0版本推出一个(bin to UUID)函数,这个可以实现UUID有序。

雪花算法可以用做主键吗?原理是怎样的?有什么优缺点?如何解决这些缺点?

雪花算法的特点和定义:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

时钟回拨

可能会存在时钟回拨问题:
在这里插入图片描述

解决方案:
在这里插入图片描述

推荐第三种方案,对雪花算法进行改造:
在这里插入图片描述

在这里插入图片描述

当发现始终回拨问题后就可以递增始终序列。如果三位不满足需求可以从序列号或机器码再借几位分配给时钟序列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值