tidb表级设置AUTO_ID_CACHE=1后,id自增异常

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【概述】 sysbench 1.20 混合读写压测,prepare数据后,max(id) 接近count 行数的1.5倍。每插入2688行数据后,第2689行id 会跳高1313。造成巨大的id 间隙。

【应用框架及开发适配业务逻辑】
sysbench 1.20

【背景】 做过哪些操作
vim oltp_common.lua 修改create_table function 增加 AUTO_ID_CACHE=1

time sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host=xxx.xxx.16.65 --mysql-port=6000 --mysql-user=root --mysql-password=‘xxx’ --mysql-db=sbtest --table_size=1000000 --tables=10 --threads=10 --time=300 prepare
【现象】 业务和数据库现象
默认建表sql ,prepare 数据如下:
CREATE TABLE sbtest4 (

id int(11) NOT NULL AUTO_INCREMENT,

k int(11) NOT NULL DEFAULT ‘0’,

c char(120) NOT NULL DEFAULT ‘’,

pad char(60) NOT NULL DEFAULT ‘’,

PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */,

KEY k_4 (k)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1221704
select max(id),min(id) ,count(1) from sbtest.sbtest4;

±--------±--------±---------+

| max(id) | min(id) | count(1) |

±--------±--------±---------+

| 1003089 | 1 | 1000000 |

±--------±--------±---------+

表级设置AUTO_ID_CACHE=1后,建表sql ,后prepare 数据如下:
CREATE TABLE sbtest2.sbtest4 (

id int(11) NOT NULL AUTO_INCREMENT,

k int(11) NOT NULL DEFAULT ‘0’,

c char(120) NOT NULL DEFAULT ‘’,

pad char(60) NOT NULL DEFAULT ‘’,

PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */,

KEY k_4 (k)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1486753 /*T![auto_id_cache] AUTO_ID_CACHE=1 */
select max(id),min(id) ,count(1) from sbtest2.sbtest4;

±--------±--------±---------+

| max(id) | min(id) | count(1) |

±--------±--------±---------+

| 1486752 | 1 | 1000000 |

±--------±--------±---------+

【问题】 当前遇到的问题
AUTO_ID_CACHE=1 兼容mysql 自增,id存在巨大的间隙。
【业务影响】
数据超过2688行,不满足id 连续自增的要求。
【TiDB 版本】
7.5.1
【附件】 相关日志及监控

看文档说 MySQL 兼容模式的使用方式是,建表时将 AUTO_ID_CACHE 设置为 1
应该不会出现这种情况啊,要不手动模拟insert 语句试一下, 是不是sysbench 有基于id的dml 操作

挺奇怪的,我们测试自增没发现这个问题,你看看是不是tidb server出问题了,这样会跳跃

升级小版本到最新,有bug,已经修复了

应该是BUG

有bug修复的文档吗

楼主的 TiDB v7.5.1 已经是最新的版本了,之前确实有 bug autoid service rebase internal SQL should not meet transaction conflict · Issue #50819 · pingcap/tidb · GitHub 在 v7.5.1 已经修复了,如果你可以复现问题,建议在 github 上提交 issue。

tidb server 的log 只有大量的
[WARN] [txn.go:167] [RunInNewTxn] [“retry txn”=448953402557202509] [“original txn”=448953402557202509] [error=“[kv:9007]Write conflict, txnStartTS=448953402557202509, conflictStartTS=448953402557202655, conflictCommitTS=448953402557202662, key={metaKey=true, key=DB:618, field=TID:1096}, originalKey=6d44423a3631380000fd00000000000000685449443a31303936ff0000000000000000f7, primary={metaKey=true, key=DB:618, field=TID:1096}, originalPrimaryKey=6d44423a3631380000fd00000000000000685449443a31303936ff0000000000000000f7, reason=Optimistic [try again later]”]

没见issue 中 的 autoid 关键字

已经提交bug了
after create table add auto_id_cache , the AUTO_INCREMENT col have the huge gap · Issue #52465 · pingcap/tidb (github.com)

升级版本

不建议使用自增,这个列没任何作用。只能说明你的主键而已,主键让开发自己设置一列让他自己生成雪花id或者随机uuid都可以。比自增好多了。

高并发情况下,用 AutoRandom