数据库自增主键可能的问题
单表的情况下数据库自增id并没有什么问题,在一张表分布到多个数据库的情况下,使用表自增将会出现id重复的问题
解决的办法有两个方向,一个是在应用层做处理,一个是数据库上去做处理
1.给每个数据库设置不同的开始id
数据库1 从 10000.. 开始
数据库2 从 20000.. 开始
这种办法不依赖于其他服务实现id唯一性,即时其他数据库挂了依然能生成id
2.使用一个库专门生成id
id列不设自增,由应用设置id
建立单独的id生成数据库,库中建立多个id生成表,每个表如下
+-------------------+------+ | id | stub | +-------------------+------+ | 72157623227190423 | a | +-------------------+------+
每次插入数据时先从该库的对应id生成表中更新id
REPLACE INTO Tickets64 (stub) VALUES ('a'); SELECT LAST_INSERT_ID();
执行后表内数据id增加1,并返回新id
然后使用该id插入到表中,这种方法的好处是能够统计每个表的数据量
3.使用Redis分批次生成id
redis中存储一个id的 当前批次值 ,应用每次获取该值的时候增加1,每个批次的数量是固定的
比如批次10,开始id为 10 x 1000 结束id为 (10 + 1) x 1000 - 1
id使用完成后再去获取一个批次id