振振有词
(zhenLEE)
1
【TiDB 使用环境】生产环境
【TiDB 版本】tidb 7.1.5
有一张表原本是聚簇索引,自增主键 bigint,后来因为写入热点要通过临时表,调整为非聚簇,于是如下所示
SHARD_ROW_ID_BITS = 6,自增值是 2012087623989455459,已经超过了 2*57
原本以为 BIGINT 很大,结果发现临时表在配置了 6 位分片后,虽然是空表,但是插入数据,TiDB 会报错 Failed to read auto-increment value
- 修改为非聚簇索引后,隐藏的 _row_id 会复用自增的 id 列的自增值?
- 增加SHARD_ROW_ID_BITS会因为占用自增位,导致支持的行数变少?
- 现在的 ID 已经很大了,但又想解决写入热点问题,还有别的办法吗?
CREATE TABLE `user_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`age` int(11) DEFAULT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`name`, `create_time`) /*T![clustered_index] NONCLUSTERED */,
KEY `idx_id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2012087623989455459 /*T! SHARD_ROW_ID_BITS=6 */;
xfworld
(魔幻之翼)
2
SHARD_ROW_ID_BITS 要切换成 auto_random 才会生效了…
建议新建一个表,把数据搬过来…
振振有词
(zhenLEE)
3
SHARD_ROW_ID_BITS 在非聚簇索引表上可用
如果是 auto random 随机主键也不需要SHARD_ROW_ID_BITS 来打散
他们开发现在强要求这个自增值,想了想没啥好办法 …
https://docs.pingcap.com/zh/tidb/v7.1/shard-row-id-bits/
TiDBer_SSUU
(Ti D Ber Ssu Uw M5d)
4
SPLIT TABLE user_info BETWEEN (1) AND (9223372036854775807) REGIONS 16;
振振有词
(zhenLEE)
5
哦提前分配 region 是个方法,那如果是一次性百万的导入,直接预分配 128 个看着也行
SPLIT TABLE user_info BETWEEN (1) AND (9223372036854775807) REGIONS 128;
https://docs.pingcap.com/zh/tidb/v7.1/sql-statement-split-region/
AUTO_INCREMENT还是自增,SHARD_ROW_ID_BITS的作用没发挥出来
振振有词
(zhenLEE)
10
振振有词
(zhenLEE)
11
索引这个确实不知道有什么好的设计方案,期待分享经验