在 MySQL 数据库中,如果业务系统希望封装唯一值,比如增加日期,用户等信息,AUTO_INCREMENT 的方法会带来很大的不便,在实际的系统设计的时候, 也存在不同的折中方法,比如:
- 序列值由 Application 或者 Proxy 来生成,不过弊端很明显,状态带到应用端,增加了扩容和缩容的复杂度。
AliSQL 自主实现了 SEQUENCE ENGINE,通过引擎的设计方法,尽可能的兼容其他数据库的使用方法,简化获取序列值复杂度。
Description
AliSQL 支持的 SEQUENCE,实现了MySQL存储引擎的设计接口,但底层的数据仍然使用现有的存储引擎,比如 InnoDB 或者 MyISAM 来保存持久化数据,以便尽可能的保证现有的外围工具比如XtraBackup等工具的兼容,所以 SEQUENCE ENGINE 仅仅是一个逻辑引擎。
对 sequence 对象的访问通过 SEQUENCE handler 接口,这一层逻辑引擎主要实现 NEXTVAL 的滚动,CACHE 的管理等,最后透传给底层的基表数据引擎,实现最终的数据访问。
1. CREATE SEQUENCE Syntax:
SEQUENCE OPTIONS:
- START
Sequence的起始值 - MINVALUE
Sequence的最小值,如果这一轮结束并且是cycle的,那么下一轮将从MINVALUE开始 - MAXVALUE
Sequence的最大值,如果到最大值并且是nocycle的,那么将会得到以下报错: - CACHE/NOCACHE
Cache的大小,为了性能考虑,可以设置cache的size比较大,但如果遇到实例重启,cache内的值会丢失 - CYCLE/NOCYCLE
表示sequence如果用完了后,是否允许从MINVALUE重新开始
例如:
2. SHOW SEQUENCE Syntax
3. QUERY STATEMENT Syntax
4. 兼容性
因为要兼容MYSQLDUMP的备份方式,所以支持另外一种CREATE SEQUENCE方法,即:通过创建SEQUENCE表和INSERT一行初始记录的方式, 比如:
但强烈建议使用native的CREATE SEQUENCE方法。
- Sequence不支持 subquery 和 join
- 不支持 CREATE TABLE 的时候指定 SEQUENCE 引擎,sequence 表只能通过 CREATE SEQUENCE 的语法来创建