当你使用了分布式数据库系统后,就会面临生成记录唯一标识问题,传统的单表当然由自带的auto-increment primary key解决了。但是还是不建议这么做,因为在未来面临拆库还会有id重复问题。很多人首先会想到MongoDB ObjectId和UUID, 但是这种string类型会给程序带来复杂度,不仅存储空间大,而且不能很好的支持sort。我目前项目的unique identifier至少要满足如下要求:唯一性可排序顺序递增(B-Tree索引存储高效需要)高效,避免复杂操作第一种方案:利用数据库的自增机制使用专门的数据库生成ID:CREATE TABLE `ticks` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`stub` char(1) NOT NULL DEFAULT 'a',
PRIMARY KEY (`id`),
UNIQUE KEY `stub` (`stub`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
#使用如下语句获取唯一id
REPLACE INTO tickets (stub) VALUES ('a');
SELECT LAST_INSERT_ID();当然,为了避免单点,可部署多台,如两台,就将自增步长设为2(auto-increment-increment = 2),同时设置auto-increment-offset分别为1,2,这样,这样第一台数据库服务器的自增id为 1 3 5 7 9 第二台为2 4 6 8 10。第二种方案:利用内存自增上面的写库方案在并发量大的时候会有性能问题和延迟,所以在内存中自增,会加快生成速度。