其实这是分库分表后必然要面对的一个问题,就是id怎么生成?因为要是分成多个表之后,每个表都是从1开始累加,那肯定不对啊,需要一个全局唯一的id来支持。

以下几种id主键的方案:

一、 数据库自增id

这个就是说你的系统里每次得到一个id,都是往一个库的一个单独的表里插入一条没什么意义的数据,然后获取到这条数据自增的id,拿到这个id后再往对应的分库分表里去写入。

这个方案就是简单,缺点就是单库生成自增id,要是高并发的话会有瓶颈,而且有单点故障问题,你要是整两台数据库机器,又资源浪费。如果硬要用这个方案,那就专门开一个服务,这个服务每次都拿到单独表的最大id值,然后自己递增几个id,一次性返回一批id,然后再把单独表中当前最大id值修改为返回的这批id中的一个值。

适合的场景:你分库分表就两个原因,要不就是单库的并发太高,要不就是单库的数据量太大。除非你是并发不高,但是数据量太大导致的分库分表扩容,你就可以使用这个自增id的方案,因为可能每秒最高并发最多几百,那么就走单独的一个库和表生成自增id即可。

总结:适合并发很低,几百/s,但是数据量很大,几十亿的数据,所以需要靠分库分表来存放海量的数据。

二、 uuid

好处:就是本地生成,不需要依赖数据库。

缺点:uuid太长了,作为主键性能太差了,不适合用于主键。

三、 获取当前系统时间

这个就是获取当前时间即可,但是并发很高的时候,比如一秒几千,会有重复的情况。

适合的场景:一般如果用这个方案,是将当前时间跟很多其他的业务字段拼接起来的,做为一个id,如果业务上你觉着可以接受,那么也是可以的,可以将别的业务字段跟当前时间拼接起来,组成一个全局唯一的编号。

四、 snowflake算法

雪花算法是开源的,生成id的结果是一个64bit大小的整数,结构如下:

分库分表之后全局id咋生成?_主键

SnowFlake可以保证:

1、所有生成的id按时间趋势递增

2、整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分)

雪花算法,要是搞分布式id生成,这个算法性能比较好,一般每秒几万的并发足够。