分布式和非分布式关于sequence的区别

分布式和非分布式关于sequence的区别作者 AAA John 很多金融用户在使用 TDSQL 的时候经常会用到 sequence 跟 Oracle sequence 功能用法基本类似 下面介绍下 TDSQL 分布式和非分布式关于 sequence 的区别分布式实例应用 sequence cd d

大家好,欢迎来到IT知识分享网。

作者:AAA-John

很多金融用户在使用TDSQL的时候经常会用到sequence,跟Oracle sequence功能用法基本类似,下面介绍下TDSQL分布式和非分布式关于sequence的区别

分布式实例应用sequence

# cd /data/tdsql_run/15002/gateway/conf/

vim instance_15002.cnf

修改save_in_db 参数为1

— 创建表

CREATE TABLE student (

s_id int(10) NOT NULL,

s_name varchar(20) NOT NULL DEFAULT ”,

s_birth varchar(20) NOT NULL DEFAULT ”,

s_sex varchar(10) NOT NULL DEFAULT ”,

s_high int(255) DEFAULT NULL,

PRIMARY KEY (s_id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 shard_key=s_id;

— 创建序列

CREATE tdsql_sequence sequence_001 START WITH 10 tdsql_minvalue 10 MAXVALUE 20 tdsql_increment BY 1 tdsql_nocycle;

— 查看下一个序列值

select tdsql_nextval(sequence_001);

— 查看上一次的序列值,与连接有关,如果之前没有用nextval获取过,则返回0

select tdsql_lastval(sequence_001);

— 删除序列

drop tdsql_sequence sequence_001;

— 查看序列定义

show create tdsql_sequence sequence_001;

— 应用序列

insert into student (s_id,s_name,s_seatid) values(1007,’李星’,tdsql_nextval(sequence_001));

insert into student (s_id,s_name,s_seatid) values(1008,’王大力’,tdsql_nextval(sequence_001));

— 查看库中所有的序列

/*sets:allsets*/select * from xa.auto_inc_table;

创建序列所用到的参数说明:

tdsql_increment by n :步长,每次增长多少

start with n :初始值

maxvalue 升序序列最大值,

tdsql_minvalue 降序序列最小值,

tdsql_cycle : 到最大值之后,是循环。

tdsql_nocycle. 循环结束后再次使用,sequence 将会报 sequence run out。

分布式和非分布式关于sequence的区别

非分布式实例应用sequence

— 创建表

CREATE TABLE student (

s_id int(10) NOT NULL,

s_name varchar(20) NOT NULL DEFAULT ”,

s_birth varchar(20) NOT NULL DEFAULT ”,

s_sex varchar(10) NOT NULL DEFAULT ”,

s_high int(255) DEFAULT NULL,

PRIMARY KEY (s_id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

— 创建序列

CREATE TDSQL_SEQUENCE sequence_002 TDSQL_INCREMENT BY 1 START WITH 1 TDSQL_MAXVALUE TDSQL_MINVALUE 1 TDSQL_CYCLE TDSQL_CACHE 20 TDSQL_NOORDER;

— 查询序列的下一个值

SELECT sequence_002.nextval;

— 查询序列的当前值

select sequence_002.currval;

— 同一行sql,同时引用CURRVAL和NEXTVAL,序列值保持一致。

insert into student(s_id,s_name,s_seatid) values(sequence_002.nextval,’马丽’,sequence_002.currval);

— 应用序列

insert into student (s_id,s_name,s_seatid) values(1001,’田杰’,sequence_002.nextval);

insert into student (s_id,s_name,s_seatid) values(1002,’王红’,sequence_002.nextval);

— 删除序列

drop tdsql_sequence sequence_002;

创建序列参数说明:

TDSQL_INCREMENT BY 设置序列步长,正数表示升序序列,负数表示降序序列。设置值必须在序列最大值与最小值之间,缺省则默认1。

START WITH 序列起始值,缺省则默认序列最小值。

TDSQL_MAXVALUE和TDSQL_MINVALUE 缺省或者设置TDSQL_NOMAXVALUE时,递增序列最大值为,递减序列最大值为-1。序列最小值,TDSQL_MINVALUE缺省或者设置TDSQL_NOMINVALUE时,递增序列最小值为1,递减序列最小值为-。

TDSQL_CYCLE和TDSQL_NOCYCLE 序列是否循环,缺省默认不循环。

TDSQL_CACHE和TDSQL_NOCACHE 缓存序列数量,缺省默认缓存20。

TDSQL_ORDER和TDSQL_NOORDER 序列对于并发请求保证完全有序。TDSQL目前仅支持无序。

分布式和非分布式关于sequence的区别

总结:关于性能,影响sequence性能的因素主要是sequence的cache数值,cache越大,每次修改mysql.tdsql_sequence表中该sequence的元数据后可以产生越多的sequence值,因而性能越好。当然,与Oracle的sequence一样,如果mysqld crash了,那么下次重启后,sequence将从mysql.tdsql_sequences表的curval字段记录的值开始增长,可能就跳过了很多个sequence值。因此,用户通常需要选择一个合适的cache值。另外,事务回滚也不会归还占用的sequence值,这也与oracle sequence相同。

TDSQL sequence可以保证全局唯一,且连续增长。解决了mysql自增例不连续,多个表不能引用同一个自增例,同一个表不能用多个自增例等问题。但也同时带来了新的问题。那就是sequence目前为保证分布式全局唯一,性能较差,适用于并发不高的场景。因为序例值是存在DB中的,每一次使用时,都需要临时去取。

*禁止转载,可转发(转发文章请注明出处)

TDPUB数+社区

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/159523.html

(0)
上一篇 2025-01-15 20:25
下一篇 2025-01-15 20:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信