全部产品

Sequence介绍

PolarDB-X 全局唯一数字序列(64 位数字,对应 MySQL 中 Signed BIGINT 类型,以下简称为 Sequence)的主要目标是为了生成全局唯一和有序递增的数字序列,常用于主键列、唯一索引列等值的生成。

PolarDB-X 中的 Sequence 主要有两类用法:

  • 显式 Sequence,通过 Sequence DDL 语法创建和维护,可以独立使用;通过select seq.nextval;获取序列值,seq 是具体 Sequence 的名字;
  • 隐式 Sequence,在为主键定义 AUTO_INCREMENT 后,用于自动填充主键,由 PolarDB-X 自动维护。

    注意:仅拆分表和广播表指定了 AUTO_INCREMENT 后,PolarDB-X 才会创建隐式的 Sequence。非拆分表并不会,非拆分表的 AUTO_INCREMENT 的值由底层 RDS(MySQL)自己生成。

下文主要包含以下内容:

DRDS Sequence 类型与特性说明

目前共支持 2 种 Sequence 类型:

类型(缩写) 全局唯一 连续 单调递增 同一连接内单调递增 非单点 数据类型 可读性
Group Sequence(GROUP) 所有整型
Simple Sequence(SIMPLE) 所有整型

概念解释:

  • 连续:如果本次取值为 n,下一次取值一定是 n + 1,则是连续的;如果下一次取值不能保证为 n + 1,则是非连续的;
  • 单调递增:如果本次取值为 n,下一次取值一定是一个比 n 大的数,则是单调递增的;
  • 单点:存在单点故障风险;

Group Sequence(GROUP,默认使用)

特性

全局唯一的 Sequence,产生的值是自然数序列,但是不保证连续和单调递增。如果未指定 Sequence 类型,PolarDB-X 默认使用 Group Sequence。

  • 优点:全局唯一、不会产生单点问题、性能非常好。
  • 缺点:产生的序列不连续、可能会有跳跃段;不会严格从起始值开始取值;不能循环。

实现机理

采用多个节点产生值来保证高可用,每次取出一段值,如果该段值没有取完(比如连接断掉等情形),就会产生跳跃段。

Simple Sequence(SIMPLE)

特性

仅 Simple Sequence 支持自定义步长、最大值和循环/非循环利用。

  • 优点:全局唯一、连续、单调递增。
  • 缺点:单点,性能较差,存在瓶颈,需要谨慎使用。

实现机理

每产生一个值都要进行一次持久化操作。

使用场景

这两种 Sequence 都保证全局唯一,均可以应用在主键列唯一索引列

  • 大部分场景下建议选用 Group Sequence
  • 如果业务强依赖连续的 Sequence 值,此时只能使用 Simple Sequence(注意 Simple Sequence 的性能问题);

以创建一个起始值是 100000,步长为 1 的 Sequence 为例。

  • 如果采用 Simple Sequence,则会严格产生100000、100001、100002、100003、100004、.....、200000、200001、200002、200003、......这样的序列(全局唯一、连续、单调递增)。Simple Sequence 会保证持久化,即使发生单点问题,服务重启后依然会在断点继续产生 Sequence 值,中间不会产生跳跃段。Simple Sequence 的机理是每产生一个值都要进行一次持久化操作,因此性能并不是很好。

  • 如果采用 Group Sequence,产生的序列有可能是200001、200002、200003、200004、100001、100002、100003、......这样的序列。

    注意:

    • Group Sequence 起始值并不会严格从设定的参数(本例中是100000)开始,但是保证比该参数大。本例中是从 200001 开始取值的。
    • Group Sequence 保证全局唯一,但是会有跳跃段。比如 Group Sequence 的某个节点挂掉,或者某个连接只取了一部分值,然后该连接被关闭了,都会产生跳跃段。该例中 200004 和 100001 之间产生了跳跃段。