本文将为您介绍Sequence的相关概念和类型。
PolarDB-X全局唯一数字序列(64位数字,对应MySQL中Signed BIGINT类型,以下简称为Sequence)的主要目标是为了生成全局唯一和有序递增的数字序列,常用于主键列、唯一索引列等值的生成。
基本概念
了解以下概念,将帮助您更好地选用Sequence:
连续:如果本次取值为n,下一次取值一定是n + 1,则是连续的;如果下一次取值不能保证为n + 1,则是非连续的;
单调递增:如果本次取值为n,下一次取值一定是一个比n大的数,则是单调递增的;
宏观上单调递增,微观上非单调递增:类似于1、3、2、4、5、7、6、8、......这样的序列,这个序列从宏观是看是递增的,微观上非单调递增。
单元化能力:指能够跨实例或跨库分配全局唯一数字序列的能力。
用法
PolarDB-X中的Sequence主要有两类:
显式Sequence:通过DDL语法创建和维护,可以独立使用;通过
select seq.nextval
获取序列值,seq是具体Sequence的名字。隐式Sequence:通过为主键定义AUTO_INCREMENT,主键值能够自动填充,由PolarDB-X自动维护。
支持的Sequence类型及特性
PolarDB-X目前共支持如下三种Sequence类型:
类型(缩写) | 全局唯一 | 连续 | 单调递增 | 同一连接内单调递增 | 数据类型 | 可读性 | 单元化能力 |
New Sequence(NEW) | 是 | 是 | 是 | 是 | 所有整型 | 好 | 否 |
Group Sequence(GROUP) | 是 | 否 | 否 | 是 | 所有整型 | 好 | 是 |
Time-based Sequence(TIME) | 是 | 否 | 宏观上单调递增,微观上非单调递增 | 是 | 仅支持BIGINT | 差 | 否 |
New Sequence(NEW)
全局唯一、连续、单调递增的Sequence,产生的值是默认从1开始的自然数序列。
在5.4.14及以上版本的AUTO模式数据库中,如果未指定Sequence类型,默认使用New Sequence。
仅在5.4.17及以上版本支持自定义步长、限定最大值和循环分配特性。
其他使用限制请参见New Sequence。
优点:全局唯一、连续、单调递增、高性能,支持自定义步长、限定最大值和循环分配特性。
缺点:依赖GMS功能,比其他类型Sequence相对占用更多的GMS资源。
示例:
创建一个起始值为100000的New Sequence,会严格产生如下序列,保证全局唯一、连续、单调递增。
100000、100001、100002、100003、100004、.....、199999,200000、200001、200002、200003、......
Group Sequence(GROUP)
全局唯一的Sequence,产生的值是自然数序列,默认从100001开始,但是不保证连续和单调递增。默认不指定任何单元化参数时,会创建仅有一个单元的Group Sequence,绝大多数场景仅需要一个单元。
如果创建时指定了单元数量(参数名为UNIT COUNT)大于一,则创建的Group Sequence具备了单元化能力。单元化Group Sequence具备以下特性:
单元数量决定了单元化Group Sequence的全局唯一数字序列分配空间;
每个单元(由参数单元索引INDEX指)占用全局唯一数字序列分配空间中的一个子集;
不同单元(单元索引不同)占用的子集之间不重叠(即会分配不同的Sequence值)。
实现原理:采用多个节点产生值来保证高可用,每次取出一段值,如果该段值没有取完(例如连接断掉等情形),就会产生跳跃段。
优点:全局唯一,不会产生单点问题,性能非常好,并且具备跨实例或跨库的单元化能力。
缺点:产生的序列不连续,可能会有跳跃段;不会严格从起始值开始取值。
其他使用限制请参见Group Sequence。
示例:
创建一个起始值为100000的Group Sequence,会产生如下序列,仅保证全局唯一。
200001、200002、200003、200004、100001、100002、100003、200005、200006、......
Group Sequence实际分配的起始值,并不会严格从设定的起始值开始,但可以保证大于起始值。以上示例中是从200001开始取值的。
Group Sequence保证全局唯一,但是会有跳跃段。例如Group Sequence的某个节点失效,或者某个连接只取了一部分值,然后该连接被关闭了,都会产生跳跃段。以上示例中200004和100001之间、100003和200005之间产生了跳跃段。
Time-based Sequence(TIME)
基于时间戳+节点编号+序列号组合而成的一种Sequence,保证全局唯一和宏观自增;这种Sequence值的更新不依赖于数据节点,也不需要持久化到数据库,仅在数据库中保留名称和类型信息,性能很好;产生的是类似于776668092129345536、776668098018148352、776668111578333184、776668114812141568、......
这样的序列值。
优点:全局唯一、性能很好。
缺点:产生的序列不连续,起始值、步长、最大值、是否循环这些参数对于Time-based Sequence无意义。
用于表中自增列时,必须使用BIGINT类型。
使用场景
这三种Sequence都保证全局唯一,均可以应用在主键列和唯一索引列。
5.4.14及以上版本的AUTO模式数据库中,推荐只使用New Sequence;
DRDS模式数据库中,默认使用Group Sequence;
Group Sequence仅用于单元化和兼容PolarDB-X 1.0迁移过来的应用;
Time-based Sequence仅用于兼容PolarDB-X 1.0迁移过来的应用;