Vitess是否仅在未分片keyspace中支持sequence(自增)?创建backing table存疑
Vitess Sequence(自增)功能:支持范围与操作顺序
是不是只支持未分片keyspace?
不是,分片keyspace也能使用sequence功能,但有个关键限制:sequence依赖的backing table必须放在未分片的keyspace里。
- 未分片keyspace:可以直接在当前keyspace内创建backing table和sequence,绑定到本地表的字段上,逻辑最简单。
- 分片keyspace:不能在分片keyspace里建sequence的backing table(否则会因为分片导致计数器状态混乱),需要先在某个未分片keyspace建好backing table和sequence,然后在分片keyspace的表中跨keyspace引用这个sequence。
正确的操作顺序(含分片场景)
不管哪种场景,核心顺序都是先建backing table,再创建sequence——因为sequence的自增计数器是存在backing table里的,没有这个表,sequence没法正常工作。
通用步骤(未分片keyspace场景)
- 先创建backing table(普通InnoDB表,结构固定):
CREATE TABLE seq_backing ( name VARCHAR(64) PRIMARY KEY, value BIGINT UNSIGNED NOT NULL DEFAULT 0 ) ENGINE=InnoDB; - 基于这个backing table创建sequence:
CREATE SEQUENCE user_id_seq USING TABLE seq_backing START WITH 1 INCREMENT BY 1; - 在业务表中使用这个sequence作为字段默认值:
CREATE TABLE user ( id BIGINT UNSIGNED NOT NULL DEFAULT nextval(`user_id_seq`), username VARCHAR(50) NOT NULL, PRIMARY KEY(id) );
分片keyspace场景额外注意
如果你的业务表在分片keyspace里,只需要在引用sequence时加上未分片keyspace的前缀即可:
-- 假设未分片keyspace叫`unsharded`,sequence是`unsharded.user_id_seq` CREATE TABLE sharded_user ( id BIGINT UNSIGNED NOT NULL DEFAULT nextval(`unsharded.user_id_seq`), username VARCHAR(50) NOT NULL, PRIMARY KEY(id) ) COMMENT 'vitess_hash(id)';
内容的提问来源于stack exchange,提问作者GurbaniX
相关产品推荐
相关产品推荐

