以下大部分内容非原创,整理自阿里云官方文档
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,才可以保证连续、单调递增。