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

2021-08-01 04:05:07 字數 1035 閱讀 3591

大型**資料量龐大,為了能增加資料儲存量,提公升讀寫效率,資料庫分庫分表是常見的一種方案。但是這樣同時也帶來了一些問題,比如分庫分表後如何保證主鍵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生成的自增值,所以其他連線執行的操作並不會影響當前連線的自增值,這樣就不會出現自增值錯亂的問題。

參考:

1、mysql分庫分表環境下全域性id生成方案

2、分庫分表全域性id生成

MySQL分庫分表環境下全域性ID生成方案

摘要介紹來自flicker和twitter的兩種解決分布式環境下全域性id生成方案。在大型網際網路應用中,隨著使用者數的增加,為了提高應用的效能,我們經常需要對資料庫進行分庫分表操作。在單錶時代,我們可以完全依賴於資料庫的自增id來唯一標識乙個使用者或資料物件。但是當我們對資料庫進行了分庫分表後,就...

分庫分表方案(一)

零 概述 當活躍連線數量接近或者達到資料庫可以承載的連線數量閾值時將會出現io瓶頸和cpu效能瓶頸,進而導致上層業務系統的併發量 吞吐量出現問題,甚至導致系統崩潰。下面我先來說一下造成io瓶頸和cpu效能瓶頸的原因。cpu瓶頸 當sql語句中含有 join group by order by 以及非...

Mysql分庫分表方案

1.為什麼要分表 當一張表的資料達到幾千萬時,你查詢一次所花的時間會變多,如果有聯合查詢的話,我想有可能會死在那兒了。分表的目的就在於此,減小資料庫的負擔,縮短查詢時間。mysql中有一種機制是表鎖定和行鎖定,是為了保證資料的完整性。表鎖定表示你們都不能對這張表進行操作,必須等我對錶操作完才行。行鎖...