1. 程式人生 > >分庫分表全域性ID方案(一)

分庫分表全域性ID方案(一)

大型網站資料量龐大,為了能增加資料儲存量,提升讀寫效率,資料庫分庫分表是常見的一種方案。但是這樣同時也帶來了一些問題,比如分庫分表後如何保證主鍵ID的自增以及唯一。
自增ID+replace into利用mysql自帶的主鍵id自增功能,使用replace into語句更新生成全域性ID。

CREATE TABLE `t_id` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `stub` char(1) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_stub`
(`stub`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

建立表,結構如上圖,我們要利用的就是表中的主鍵id。從結構中可以看到,我們設定了主鍵id和唯一索引鍵stub(重要),實現id的自增就是靠Mysql的 replace into 的處理機制。
首先看下sql語句,如下:

REPLACE INTO t_id (stub) VALUES ('1');

我們知道,Mysql的replace into語句處理方式是,發現表中有stub為1的資料則更新,沒有則新增。新增就不用說了,和insert效果一致,得到的id就是唯一的。更新的時候其實是做了兩步操作,先將原資料刪除,再新增一條資料,這樣就實現了主鍵id的自增並且唯一。獲取自增鍵值:

SELECT LAST_INSERT_ID();

因為last_insert_id獲得的是當前資料庫連線中最近一次操作中執行insert生成的自增值,所以其他連線執行的操作並不會影響當前連線的自增值,這樣就不會出現自增值錯亂的問題。