單表的情況下數據庫自增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