简介
表结构设计的好坏会影响到最终的结果。
SCHEMA的设计
非聚簇索引数据热定问题

- 问题来源,由于非聚簇索引的row_id是系统自动生成的只增加序列,这个时候就会都往一个region里面开始写入数据,就会产生写入热点的问题。
- SHARD_ROW_ID_BITS是预分区,它只是一个逻辑的概念,PRE_SPLIT_REGIONS是建表以后就直接生成对应的region,减少数据插入的时候生成region的时间。
- 如果表是自增的主键的时候,也会出现数据插入热点的问题。
分区表
自增主键的原理
使用限制
自增主键解决数据热点问题
原理
后面的auto_random(3)的3是生成随机位的位数,越大越随机。
使用限制

设计建议
高兼容性(从mysql迁移到TiDB)解决写入热点问题
因为这里用到的 SHARD_ROW_ID_BITS是预分区,它只是一个逻辑的概念,PRE_SPLIT_REGIONS是建表以后就直接生成对应的region,减少数据插入的时候生成region的时间。 就会把AUTO_INCREMENT数据给打散。
高性能(新业务的情况)减少回表查询的情况

实操
非聚簇表数据打散操作
use test;
create table test.`noncluster_order`(
`id` bigint(20) unsigned not null auto_increment,
`code` varchar(30) not null,
primary key (`id`) nonclustered
) ;
#查看创建表的region
show table noncluster_order regions;
mysql> show table noncluster_order regions;
+-----------+-----------+---------+-----------+-----------------+-------------+------------+---------------+------------+----------------------+------------------+
| REGION_ID | START_KEY | END_KEY | LEADER_ID | LEADER_STORE_ID | PEERS | SCATTERING | WRITTEN_BYTES | READ_BYTES | APPROXIMATE_SIZE(MB) | APPROXIMATE_KEYS |
+-----------+-----------+---------+-----------+-----------------+-------------+------------+---------------+------------+----------------------+------------------+
| 66 | t_69_ | | 95 | 4 | 67, 95, 133 | 0 | 238 | 994 | 1 | 0 |
+-----------+-----------+---------+-----------+-----------------+-------------+------------+---------------+------------+----------------------+------------------+
drop table noncluster_order;
#创建一个预分片表
create table test.`noncluster_order`(
`id` bigint(20) unsigned not null auto_increment,
`code` varchar(30) not null,
primary key (`id`) nonclustered
) engine=InnoDB shard_row_id_bits=4 pre_split_regions=3;
#查看创建表的region
show table noncluster_order regions;
mysql> show table noncluster_order regions;
+-----------+----------------------------+----------------------------+-----------+-----------------+------------------+------------+---------------+------------+----------------------+------------------+
| REGION_ID | START_KEY | END_KEY | LEADER_ID | LEADER_STORE_ID | PEERS | SCATTERING | WRITTEN_BYTES | READ_BYTES | APPROXIMATE_SIZE(MB) | APPROXIMATE_KEYS |
+-----------+----------------------------+------------

文章介绍了在TiDB数据库中,如何通过预分区(SHARD_ROW_ID_BITS)和预分裂(PRE_SPLIT_REGIONS)来解决非聚簇索引和自增主键导致的数据写入热点问题。通过示例展示了创建预分区表和手动分区的方法,以及观察数据是否均匀分布到不同region,以确保高性能和数据分散。
1620

被折叠的 条评论
为什么被折叠?



