unique key设置为自增id,在一个节点插入数据id不连续都是奇数

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v3.1.0-beta.1
  • 【问题描述】:一张表没有设置主键,然后把unique key设置为自增id,在一个tidb-server节点插入数据id不连续都是奇数,但是把这列自增id设置为primary key后插入数据后id 就都是连续的

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

你好,在测试环境无法重现,麻烦提供下建表语句以及 insert 语句 , 还有 select tidb_version() 的信息。

您这种写法是正常的,如果一条一条写的话,会出现我说的状况
insert into t1 (x) values (x);
insert into t1 (x) values (x);
insert into t1 (x) values (x);


这样分开写就会出现

已经重现,感谢反馈。我们这边内部排查一下。

确认了一下,这个是预期内的行为,因为在没有 primary key 的情况下, auto_increment 的池子有一部分配给 _tidb_rowid

mysql> insert into t2 (c1) values (1);insert into t2 (c1) values (2);insert into t2 (c1) values (3);
Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

mysql> select * from t2;
+------+------+
| id   | c1   |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    3 |
|    7 |    1 |
|    9 |    2 |
|   11 |    3 |
+------+------+
6 rows in set (0.00 sec)

mysql> show create table t2;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                          |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t2    | CREATE TABLE `t2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c1` int(11) DEFAULT NULL,
  UNIQUE KEY `uk_id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30001 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select _tidb_rowid,id from t2;
+-------------+------+
| _tidb_rowid | id   |
+-------------+------+
|           4 |    1 |
|           5 |    2 |
|           6 |    3 |
|           8 |    7 |
|          10 |    9 |
|          12 |   11 |
+-------------+------+
6 rows in set (0.01 sec)
1 个赞

好的谢谢,这个是出于什么考虑为什么_tidb_rowid和unique_key要共用一个auto_increment,而不是_tidb_rowid独自维护一个

历史问题,后面会考虑分开做

1 个赞

好的 感谢

感谢解答

:+1::+1::+1:

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