以下大部分內容非原創,整理自阿里云官方文檔
DRDS Sequence簡介
DRDS 全局唯一數字序列(64 位數字,對應 MySQL 中 Signed BIGINT 類型)的主要目標是為了生成全局唯一和有序遞增的數字序列,常用于主鍵列、唯一索引列等值的生成。
顯式與隱式
- 顯式 Sequence,通過 Sequence DDL 語法創建和維護,可以獨立使用;通過select seq.nextval;獲取序列值,seq 是具體 Sequence 的名字;
- 隱式 Sequence,在為主鍵定義 AUTO_INCREMENT 后,用于自動填充主鍵,由 DRDS 自動維護。
注意:僅拆分表和廣播表指定了 AUTO_INCREMENT 后,DRDS 才會創建隱式的 Sequence。
非拆分表并不會,非拆分表的 AUTO_INCREMENT 的值由底層 RDS(MySQL)自己生成。
三種類型
Group Sequence(GROUP)
全局唯一的 Sequence,產生的值是自然數序列,但是 不保證連續和單調遞增。如果未指定 Sequence 類型,DRDS 默認使用 Group Sequence。
Time-based Sequence(TIME)
基于時間戳 + 節點編號 + 序列號組合而成的一種 Sequence,保證全局唯一和 宏觀自增(產生的序列不連續)。
Simple Sequence(SIMPLE)
支持自定義步長、最大值和循環/非循環利用。但每產生一個值都要進行一次持久化操作,性能不好。
大部分場景下建議選用Group Sequence
如果業務強依賴連續的Sequence,此時只能使用 Simple Sequence(注意性能問題)
對于性能要求比較高時優先考慮使用 Time-based Sequence
創建及刪除顯式Sequence
默認創建GROUP類型
CREATE SEQUENCE seq1;
指定GROUP類型
CREATE GROUP SEQUENCE seq2;
指定TIME類型
CREATE TIME SEQUENCE seq3;
指定SIMPLE類型(起始值是 1000,步長為 2,最大值為 99999999999,增長到最大值后不繼續循環)
CREATE SIMPLE SEQUENCE seq4 START WITH 1000 INCREMENT BY 2 MAXVALUE 99999999999 NOCYCLE;
刪除Sequence
DROP SEQUENCE seq1;
查詢Sequence
SHOW SEQUENCES
取Sequence的值
select seq1.NEXTVAL;
select seq1.NEXTVAL from dual;
隱式用法
語法
CREATE TABLE <name> (
<column> ... AUTO_INCREMENT [ BY GROUP | SIMPLE | TIME ],
<column definition>,
...
) ... AUTO_INCREMENT=<start value>
示例
CREATE TABLE `group_seq_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2000 DEFAULT CHARSET=utf8 dbpartition by hash(`id`);
insert into group_seq_tbl (name) values ('foobar');
select * from group_seq_tbl;
查看建表語句
SHOW CREATE TABLE group_seq_tbl;
修改起始值
SHOW SEQUENCES;
ALTER SEQUENCE AUTO_SEQ_group_seq_tbl START WITH 600000;
select AUTO_SEQ_group_seq_tbl.nextval;
將GRUOP類型一個Sequence的START由200000設成300000后,測試nextval時會從400000開始。
這不是BUG,是由GROUP特性決定的。使用SIMPLE,才可以保證連續、單調遞增。