基於mysql的全域性ID生成方案

2021-06-20 11:58:32 字數 1117 閱讀 7073

背景介紹——隨著資料庫容量的增加,在對資料庫完成垂直拆分效果不是很理想的情況下需要對資料庫進行水平拆分,而由於乙個表被分成了多份,不能再使用之前的單錶的自增id作為主鍵,所以需要乙個全域性的id生成器來統一的進行id分配,全域性id的生成有很多種方案,此處介紹乙個最簡單的實現。

實現方案——mysql作為乙個成熟的關係型資料庫在資料的備份和功能上有很多優勢,此處基於mysql的自增id實現乙個全域性的id生成器,能夠減少很多的開發工作。下面說一下其實施方案,此處的mysql是單點訪問,容災方面主要靠主從機制。實施中主要是對mysql建立相應的序列表結構和書寫客戶端**。此處的序列庫是與乙個庫上的乙個表對應的,即資料庫名稱+表名稱會獲取乙個id序列。

mysql上的建庫和建表語句如下:

1.建庫語句:

create

database

資料庫名稱

default

charset

utf8

;2.建表語句:

use資料庫名稱

;create

table`表名

`(`id` bigint(20) unsigned not null auto_increment,

`stub` char(1) not null default '',

primary key (`id`),

unique key `stub`(`stub`)

) engine=myisam default charset=utf8;

3.初始值的設定和步長的設定:

alter table 表名 auto_increment = 起始值;

replace into 表名 (stub) values ('a');

select last_insert_id();

4.客戶端獲取全域性id語句:

replace into 表名(stub) values ('a'); 

select last_insert_id();

5.注意事項:mysql資料庫引擎需要使用

myisam,使用

innodb效能會差很多,客

戶端執行的這兩條語句是在同

一條連線裡的,否則會獲取失敗。

分布式全域性ID生成方案

1 背景 分布式架構下,唯一序列號生成是我們在設計乙個系統,尤其是資料庫使用分庫分表的時候常常會遇見的問題。當分成若干sharding表後,如何能夠快速拿到乙個唯一序列號,是經常遇到的問題。在網際網路的業務系統中,涉及到各種各樣的id,如在支付系統中就會有支付id 退款id等。那一般生成id都有哪些...

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

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

Zookeeper全域性唯一ID生成方案解析

系統唯一id生成分案有很多種,例如 資料庫 auto increment,uuid,redis生成id redis原子操作incr和incrby twiitter的snowflake演算法,zookeeper生成id,mongodb的objectid,下面我們就看一下zookeeper實現分布式系統...