为什么不能使用自增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有序。
雪花算法可以用做主键吗?原理是怎样的?有什么优缺点?如何解决这些缺点?
雪花算法的特点和定义:
时钟回拨
可能会存在时钟回拨问题:
解决方案:
推荐第三种方案,对雪花算法进行改造:
当发现始终回拨问题后就可以递增始终序列。如果三位不满足需求可以从序列号或机器码再借几位分配给时钟序列。