SHARD_ROW_ID_BITS会影响自增id的取值范围,是否是一个BUG

【TiDB 版本】
4.x

【问题描述】
在id bigint unique key、 AUTO_INCREMENT、SHARD_ROW_ID_BITS的情况下,指定了一个较大的值:1377167639356443234 ,报错 ERROR 1467 (HY000): Failed to read auto-increment value from storage engine
但1377167639356443234并未超过bigint的取值范围,并且此现象出现之后不可修复。

CREATE TABLE `t1` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  unique KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin SHARD_ROW_ID_BITS=4

MySQL [test]> insert into t1 values();
Query OK, 1 row affected (1.71 sec)

MySQL [test]> insert into t1 values();
Query OK, 1 row affected (0.33 sec)

MySQL [test]> select * from t1;
+----+
| id |
+----+
|  1 |
|  3 |
+----+
2 rows in set (0.00 sec)

MySQL [test]> insert into t1 values(1377167639356443234);
ERROR 1467 (HY000): Failed to read auto-increment value from storage engine
MySQL [test]> insert into t1 values();
ERROR 1467 (HY000): Failed to read auto-increment value from storage engine

MySQL [test]> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1377167639356473235/*!90000 SHARD_ROW_ID_BITS=4 */

应该和这个已知问题类似
https://github.com/pingcap/tidb/issues/17460

如果目前有 block 点可以通过
alter table tablename SHARD_ROW_ID_BITS=0 来绕过
本身 如果主键是 int 或者 bigint 类型时候 SHARD_ROW_ID_BITS 是并不生效的

感谢回复,看到了有相关的PR,不知道会在什么版本fix。

业务上,主键是string,用了shard_row_id_bits打散热点;
又用自增id做了唯一键便于排序和关联。

有一个疑问,现有逻辑,如果这种方式最终shard的还是唯一键的自增id,那么我用shard_row_id_bits打散热点到底有没有效果…

如果主键是单列 整形的,且没有在数据写入是刻意的去打散主键(譬如 auto_increment),那么是没有效果的,并不能打散热点。
说不好听点,有点徒增烦恼了

写入热点由 KV 中 key 值连续写入造成,key 的两种取值规则如下:

  1. 索引组织表,主键组成 key 值
  2. 非索引组织表,分别配隐藏列 _tidb_rowid 做 key 值。对于非索引组织表,可以使用 shard_row_id_bits 打散 key 值分布。

唯一索引并不会对热点造成影响,唯一索引本身的连续 key 值写入,只会造成这个索引热点写入,

1 个赞

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