【云贝学院】腾讯云TDSQL-内部的序列介绍

【云贝学院】云贝学院TDSQL TCP认证课程已上线,学院有不定期公开课 需要进入讨论群的同学加老师微信:19941464235

作者:胡毅

Oracle提供了sequence对象,由系统提供自增长的序列号,用于生成数据库数据记录的自增长主键或序号的地方。如果当前的序列不存在,它会创建一个序列,如果存在,它首先要得到当前序列的最大值,然后再加一,实现自增长的功能。

在TDSQL使用过程用,也有不少金融用户要求能支持ORACLE sequence 一样功能的全局序例。而TDSQL也正是在percona数据库内核中实现了Oracle sequence功能,该功能与oracle原版sequence功能完全相同,没有任何省略和遗漏。TDSQL sequence 完全解决了mysql 自增列的缺陷;

  • sequence完全独立与表而存在,不需要作为表的索引第一列;
  • 一个表的不同字段可以使用多个sequence产生序列值;
  • 一个sequence可以给任意多个表使用产生自增序列值,也可以脱离表的insert/update语句而单独使用。

所有存储引擎上面的表都可以使用sequence功能。当然,对于SBR复制模式来说,与mysql自增列一样,使用sequence仍然会导致主备数据不一致。TDSQL使用RBR复制,所以不存在这个问题。

1、Tdsql Sequence 语法:

创建语法:
CREATE TDSQL_SEQUENCE [dbname.]sequence_name
[start with n]
[tdsql_minvalue n | nominvalue]
[maxvalue n | nomaxvalue]
[tdsql_increment by n]
[TDSQL_NOCYCLE | TDSQL_CYCLE]
​
说明:
START WITH:指定生成的第一个序列号。在升序时,序列可从比最小值大的值开始,缺省值为序列的最小值。对于降序,序列可由比最大值小的值开始,缺省值为序列的最大值。
TDSQL_INCREMENT BY:指定序列号之间的间隔,该值可为正的或负的整数,但不可为0。序列为升序。忽略该子句时,缺省值为1。
TDSQL_MINVALUE:指定序列的最小值。
MAXVALUE:指定序列可生成的最大值。
TDSQL_NOCYCLE:一直累加,不循环。

下面我们来测试一下 TDSQL 的 SEQUENCE:

#更能proxy 参数,并重启proxy
[root@huyidb01 conf]# pwd
/data/tdsql_run/15002/gateway/conf
[root@huyidb01 conf]# cat instance_15002.cnf |  grep sequence
<sequence mode="1"/>
<save_in_db open="1"/>
​
​
[root@huyidb03 bin]# ./restart_cgroup.sh instance_15002
stop router_update
OK: router_update of instance_15002 is stopped
stop proxy
OK: MySQL-Proxy of instance_15002 is stopped
rm ../data/instance_15002_embedded_mysql* -rf
port:15002
sh: ./initcgrouphierarchy.sh: No such file or directory
popen file:netstat -apn 2>/dev/null | grep 36000| grep -i LISTEN | awk '{print $4}' | awk -F':' '{print $1}' get buff is empty
hierarchy is empty,after guess is:/sys/fs/cgroup
use ../data as embedded database dir
start router_update
rm /dev/shm/0.0.0.0_15002
zookeeper timeout:10000 msec,msg timeout 30000 msec
kp init success
start proxy
[2020-12-20 16:43:36] pid:65639,we are the init master
OK: MySQL-Proxy of instance_15002 is started
​
​
#创建序例
[root@huyidb01 bin]# mysql -uhuyi -phuyi -h10.85.10.51 -P15002 -c
MySQL [(none)]> use huyidb ;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MySQL [huyidb]>  select * from mysql.tdsql_sequences ;
Empty set (0.01 sec)
​
​
#创建一个默认参数的sequence
MySQL [huyidb]> create tdsql_sequence huyidb.s1   ;
Query OK, 0 rows affected (0.01 sec)
MySQL [huyidb]> show create tdsql_sequence huyidb.s1 ;
+---------+------------------------------------------------------------------------------------------------------------------------------+
|  Table  | Create Table                                                                                                                 |
+---------+------------------------------------------------------------------------------------------------------------------------------+
| huyidb.s1 | create tdsql_sequence huyidb.s1 start with 1 tdsql_minvalue 1 maxvalue 9223372036854775806 tdsql_increment by 1 tdsql_nocycle  |
+---------+------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
​
​
#创建一个指定参数的sequence
MySQL [huyidb]> create tdsql_sequence huyidb.s2 start with 1 tdsql_minvalue 1 maxvalue 5  tdsql_increment by 1  tdsql_nocycle ;
Query OK, 0 rows affected (0.01 sec)
​
#创建一个带缓存的sequence
MySQL [huyidb]> create tdsql_sequence huyidb.s3 start with 1 tdsql_minvalue 1 maxvalue 50  tdsql_increment by 1   cache 10 tdsql_nocycle ;
Query OK, 0 rows affected (0.00 sec)
​
#虽然创建成功了,但是从生成的语句来看,并没有cache 10 关键字。
MySQL [(none)]> show create tdsql_sequence huyidb.s3;
+-----------+---------------------------------------------------------------------------------------------------------------+
|  Table    | Create Table                                                                                                  |
+-----------+---------------------------------------------------------------------------------------------------------------+
| huyidb.s4 | create tdsql_sequence huyidb.s3 start with 1 tdsql_minvalue 1 maxvalue 50 tdsql_increment by 1 tdsql_nocycle  |
+-----------+---------------------------------------------------------------------------------------------------------------+
​
​
#创建一张测试表
MySQL [(none)]> create table huyidb.test1 ( a int , b int , c int,primary key (a) ) shardkey=a;
Query OK, 0 rows affected (0.14 sec)
​
#一个表同时使用多个sequence
MySQL [(none)]> insert into huyidb.test1 (a,b,c) values (tdsql_nextval(huyidb.s1), tdsql_nextval(huyidb.s2), tdsql_nextval(huyidb.s3)) ;
Query OK, 1 row affected (0.03 sec)
MySQL [(none)]> select * from huyidb.test1 ;
+---+------+------+
| a | b    | c    |
+---+------+------+
| 1 |    1 |    1 |
+---+------+------+
1 row in set (0.00 sec)
​
​
#多个例使用同一个sequence
insert into huyidb.test1 (a,b,c) values (tdsql_nextval(huyidb.s1), tdsql_nextval(huyidb.s1), tdsql_nextval(huyidb.s1)) ;
MySQL [(none)]> select * from huyidb.test1 ;
+---+------+------+
| a | b    | c    |
+---+------+------+
| 1 |    1 |    1 |
| 2 |    3 |    4 |
+---+------+------+
2 rows in set (0.00 sec)
​
​
# nocycle 达到最大值时会报错。
MySQL [(none)]> truncate table  huyidb.test1 ;
MySQL [(none)]> insert into huyidb.test1 (a,b,c) values (tdsql_nextval(huyidb.s2), tdsql_nextval(huyidb.s2), tdsql_nextval(huyidb.s2)) ;
ERROR 609 (HY000): Proxy ERROR:get sequence id from db error
​
#查看当前最大序例
MySQL [(none)]>  select tdsql_lastval(huyidb.s2);
​
+---+
| 4 |
+---+
| 4 |
+---+
​
​
# 模拟proxy 故障前,我们查看s3序例的当前值为2
insert into huyidb.test1 (a,b,c) values (tdsql_nextval(huyidb.s1), tdsql_nextval(huyidb.s1), tdsql_nextval(huyidb.s3)) ;
MySQL [(none)]> select tdsql_lastval(huyidb.s3);
​
+---+
| 2 |
+---+
| 2 |
+---+
​
#kill proxy
ps -ef |grep gateway |grep 15002 | grep -v 'grep'| awk '{print $2}' | xargs kill -9
​
#在次登录 检查huyidb.s3序例是否连续
MySQL [(none)]> truncate table  huyidb.test1 ;
MySQL [(none)]> insert into huyidb.test1 (a,b,c) values (tdsql_nextval(huyidb.s1), tdsql_nextval(huyidb.s1), tdsql_nextval(huyidb.s3)) ;
Query OK, 1 row affected (0.01 sec)
MySQL [(none)]> select tdsql_lastval(huyidb.s3);
​
+---+
| 3 |
+---+
| 3 |
+---+
1 row in set (0.00 sec)
​
#我们登录proxy2 上插入 s3序例
mysql -uhuyi -phuyi -h10.85.10.52 -P15002 -c
MySQL [(none)]> insert into huyidb.test1 (a,b,c) values (tdsql_nextval(huyidb.s1), tdsql_nextval(huyidb.s1), tdsql_nextval(huyidb.s3)) ;
Query OK, 1 row affected (0.02 sec)
MySQL [(none)]> select tdsql_lastval(huyidb.s3);
​
+---+
| 4 |
+---+
| 4 |
+---+

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

2、SEQUENCE 的查看:

#查看下一个序例值:
MySQL [huyi]> select next value for test.s3 ;
或
MySQL [huyi]> select tdsql_nextval(huyidb.s3);
​
#查看当前序例值:
MySQL [huyi]> select tdsql_lastval(huyidb.s3);

其它待确认问题:

  • 创建sequence时,cache 关键字未生效
  • Sequence 创建成功,mysql.tdsql_sequences无数据
  • Sequence每次从DB中取值对并发性能的影响
  • Sequence 的maxvalue通过proxy 限制

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 云贝餐饮连锁V2独立版V2-2-2前端是一款基于云贝餐饮连锁系统V2的升级版本前端软件。它是云贝餐饮连锁系统的其中一部分,专门用于店铺的前台操作和管理。 V2-2-2前端在功能上进行了多项改进和优化。首先,它提供了更加直观和友好的用户界面,使用户能够更快地上手操作,提高出品效率。其次,V2-2-2前端增加了新的功能模块,例如桌位管理、订单管理、菜品管理等,使得店铺经营者能够更加方便地管理店铺运营,提高工作效率。此外,V2-2-2前端还支持移动设备的适配,店铺经营者可以随时随地对店铺进行管理,方便灵活。 除了以上功能改进,V2-2-2前端还进行了性能优化,提高了系统的稳定性和响应速度。它采用了先进的技术架构,能够快速处理大量数据,并保证系统的高可靠性。 总而言之,云贝餐饮连锁V2独立版V2-2-2前端是一款功能强大、操作简便、稳定可靠的前台管理软件,为店铺经营者提供了更好的店铺管理体验,帮助他们提高工作效率,顺利运营餐饮连锁店铺。 ### 回答2: 云贝餐饮连锁v2独立版v2-2-2前端是一种用于云贝餐饮连锁店的独立版系统的前端界面。该系统是基于最新技术开发的,旨在提供更好的用户体验和操作便利性。 该前端系统具有一系列功能和特点。首先,它提供了一个直观易用的用户界面,使店员和顾客能够快速上手。用户可以通过界面轻松浏览各种菜单和商品信息,并能方便地进行订购和点餐操作。系统还支持分餐点管理,使连锁店的各个分店能够更好地协同工作。 其次,该前端系统具有灵活的自定义功能。店家可以根据自己的需求,自定义菜单、优惠活动、店面布局等等,使系统更好地适应不同店铺的特点和运营需求。同时,系统还提供了丰富的数据报表功能,方便店家对业务数据进行分析和统计,从而做出更准确的经营决策。 另外,该前端系统还支持线上线下数据同步。店家可以通过该系统实现线上订单与实际库存的实时同步,确保库存信息的准确性。顾客也可以使用系统进行线上支付,实现线上线下一体化的购物体验。 最后,该前端系统具有良好的稳定性和安全性。系统采用了先进的技术架构和严格的安全控制措施,确保数据的安全性和稳定性,防止信息泄露和系统故障。 总而言之,云贝餐饮连锁v2独立版v2-2-2前端是一款功能强大、易于使用、稳定安全的系统,旨在提供更好的点餐和管理体验,帮助餐饮连锁店提升效率,提供优质服务。 ### 回答3: 云贝餐饮连锁v2独立版v2-2-2前端是一款餐饮连锁管理系统的前端界面更新版本。 这个版本的云贝餐饮连锁系统前端经过了一系列的改进和优化。首先,界面设计更加简洁美观,用户体验更加友好。通过优化页面布局、颜色搭配和字体选择等方面,使得操作界面更清晰明了,用户在使用过程中更容易理解和掌握各项功能。 其次,v2-2-2版本的前端增加了一些新的功能和特性。例如,引入了实时数据更新和动态图表展示功能,可以随时随地查看最新的经营数据和趋势分析。同时,还加入了多语言支持功能,可以根据用户的需求切换不同的语言界面,提升了国际化的应用能力。 此外,该版本的前端还对系统的性能进行了优化。通过对代码的精简和调优,提高了系统的响应速度和稳定性,降低了卡顿和崩溃的概率,提升了用户的使用体验。 最后,值得一提的是,云贝餐饮连锁v2独立版v2-2-2前端还支持多平台的适配,可以在不同的终端设备上运行,包括电脑、平板和手机等。这大大增加了使用的便捷性和灵活性,让用户能够方便地随时管理餐饮连锁业务。 总而言之,云贝餐饮连锁v2独立版v2-2-2前端通过界面改进、新功能增加、性能优化和多平台适配等方面的改动,为餐饮连锁管理系统提供了更好的使用体验和更为丰富的功能,有助于提高运营效率和用户满意度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值