SEQUENCE 使用问题

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】
tidb5.4 3tidb 3pd 3kv 3tiflash 混合部署

【概述】 场景 + 问题概述
创建了一个SEQUENCE: CREATE SEQUENCE sqeuence_user_id start with 2000000000000 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 2 nocycle ENGINE=InnoDB
用mysql客户端连接的时候,获取序列的下一个值后,断开连接,重新连接后获取到的序列值有可能比上一次连接获取的序列值要小


使用navicat连接后,调用nextval函数获取序列的下一个值,多次调用结果不变
image
image
【应用框架及开发适配业务逻辑】

【背景】 做过哪些操作

【现象】 业务和数据库现象

【问题】 当前遇到的问题

【业务影响】

【TiDB 版本】
5.4
【附件】 相关日志及监控(https://metricstool.pingcap.com/)


若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

2 个赞

通过负载均衡连接到后端的tidb吧,每个tidb实例的分配范围不一样,再次连接的时候可能连到另一个tidb server

1 个赞

是通过haproxy负载均衡的,连接到不同tidb server这个序列的值是有缓存可以理解,但是navicat取值为什么不变,而且值也不是正确的

1 个赞

mysql客户端方式没问题吧?不知道navicat里有啥特殊的,你说的值不正确是什么现象

1 个赞

值不正常指的是mysql客户端显示当前序列值是2000000000178,而navicat中显示200000000017,且不变,现在需要一个全局单调递增的序列方案,您这边有没有什么好方法

知道了,是navicat显示问题,比客户端少显示了一位

刚才查了一下文档,
BEGIN;
SELECT @@tidb_current_ts;
ROLLBACK;
这样可以当做全局的自增序列来用吗

这代表事务开始的时间戳,整个事务期间一直是这个值,一个事务内获取多个值的话可能不太现实

您那边有没有好的解决方案呢

具体的需求场景是什么

需要一个全局保持单调递增的序列或者计数器,允许跳跃,但是不能取到比之前小的值

tidb能全局递增的也就tso或者表的自增列,自增列的话可能有热点问题。 可以考虑使用tidb_current_ts; 然后程序内吧当前事务获得的ts值自增,或者使用外部的发号程序

1 个赞

了解了,谢谢您

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。