表切分参数的问题

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】
【概述】场景+问题概述

pre_split_regions 必须小于或等于 shard_row_id_bits。

测试如下:
让pre_split_regions 大于 shard_row_id_bits,能够成功创建表
mysql> create table t22 (a int, b int) shard_row_id_bits = 9 pre_split_regions=20;
Query OK, 0 rows affected (0.12 sec)

查看表结构,发现自动把PRE_SPLIT_REGIONS的值降低了。
mysql> show create table t22;
±------±-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
±------±-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t22 | CREATE TABLE t22 (
a int(11) DEFAULT NULL,
b int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin/*!90000 SHARD_ROW_ID_BITS=9 PRE_SPLIT_REGIONS=9 */ |
±------±-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

但是我通过修改SHARD_ROW_ID_BITS的值,可以变相的让pre_split_regions 大于 shard_row_id_bits。 那此时的结果算正常吗?

mysql> ALTER TABLE t22 SHARD_ROW_ID_BITS = 4;
Query OK, 0 rows affected (0.09 sec)

mysql> show create table t22;
±------±-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
±------±-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t22 | CREATE TABLE t22 (
a int(11) DEFAULT NULL,
b int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin/*!90000 SHARD_ROW_ID_BITS=4 PRE_SPLIT_REGIONS=9 */ |
±------±-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

另外一个问题:我把shard_row_id_bits=20,但是创建出来的等于15(32768个分片范围),不能再继续增大了,这个是为什么呢?
mysql> create table t333(a int) shard_row_id_bits=20;
Query OK, 0 rows affected (0.09 sec)

mysql> show create table t333;
±------±---------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
±------±---------------------------------------------------------------------------------------------------------------------------------------------+
| t333 | CREATE TABLE t333 (
a int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin/*!90000 SHARD_ROW_ID_BITS=15 */ |
±------±---------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

【背景】做过哪些操作
【现象】业务和数据库现象
【业务影响】
【TiDB 版本】
【附件】

  1. TiUP Cluster Display 信息

  2. TiUP Cluster Edit Config 信息

  3. TiDB- Overview 监控

  • 对应模块日志(包含问题前后1小时日志)
1 个赞

https://github.com/pingcap/docs-cn/blob/76a6118fdff44334a27d47908d4bad6c95aa2bfd/best-practices/high-concurrency-best-practices.md

1 个赞

我知道这个限制,还请仔细看我上面的测试过程,谢谢。

2 个赞

官方文档上已经描述了适应的场景和用法,你测试是为了验证什么呢?

如果你有更多的测试场景和结果,感谢你的分享~ :grin:

1 个赞

黑色字体的两个疑问呀,
官方文档就一带而过,测试的结果是另一个现象,能解答一下吗?

你说的结果正常具体指得什么 ?是说合理性 ?还是什么 ?

可以看一下这张表横跨的 region 个数是不是 < 20 个。

Q:你说的结果正常具体指得什么 ?是说合理性 ?还是什么 ?
A:是否合理?

Q:可以看一下这张表横跨的 region 个数是不是 < 20 个。
A:我就是创建了一个新表,然后看这个表的DDL结构,shard_row_id_bits=15,这种现象是否合理?

  1. 合理的,这个是建议值,所以创建可以成功;

这个是初始值,后续再进行设置,使用 alter table 设置 20 没有生效对吧?对应的 region 数量可以通过 show table 查一下吧。

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