以下大部分内容非原创,整理自阿里云官方文档
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 | select seq1.NEXTVAL; |
隐式用法
语法
1 | CREATE TABLE <name> ( |
示例
1 | CREATE TABLE `group_seq_tbl` ( |
查看建表语句
1 | SHOW CREATE TABLE group_seq_tbl; |
修改起始值
1 | SHOW SEQUENCES; |
将GRUOP类型一个Sequence的START由200000设成300000后,测试nextval时会从400000开始。
这不是BUG,是由GROUP特性决定的。使用SIMPLE,才可以保证连续、单调递增。