BlueXIII's Blog

热爱技术,持续学习

0%

阿里云DRDS Sequence

以下大部分内容非原创,整理自阿里云官方文档

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类型

1
CREATE SEQUENCE seq1;

指定GROUP类型

1
CREATE GROUP SEQUENCE seq2;

指定TIME类型

1
CREATE TIME SEQUENCE seq3;

指定SIMPLE类型(起始值是 1000,步长为 2,最大值为 99999999999,增长到最大值后不继续循环)

1
CREATE SIMPLE SEQUENCE seq4 START WITH 1000 INCREMENT BY 2 MAXVALUE 99999999999 NOCYCLE;

删除Sequence

1
DROP SEQUENCE seq1;

查询Sequence

1
SHOW SEQUENCES

取Sequence的值

1
2
select seq1.NEXTVAL;
select seq1.NEXTVAL from dual;

隐式用法

语法

1
2
3
4
5
CREATE TABLE <name> (
<column> ... AUTO_INCREMENT [ BY GROUP | SIMPLE | TIME ],
<column definition>,
...
) ... AUTO_INCREMENT=<start value>

示例

1
2
3
4
5
6
7
8
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;

查看建表语句

1
SHOW CREATE TABLE group_seq_tbl;

修改起始值

1
2
3
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,才可以保证连续、单调递增。