當你使用了分布式數據庫系統後,就會面臨生成記錄唯一標識問題,傳統的單表當然由自帶的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。這裡注意sequence表是MyISAM引擎,會讀寫串行。
第二種方案:利用內存自增
上面的寫庫方案在並發量大的時候會有性能問題和延遲,所以在內存中自增,會加快生成速度。