TiDB实战篇-表结构设计

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

简介

表结构设计的好坏会影响到最终的结果。

SCHEMA的设计

非聚簇索引数据热定问题

  1. 问题来源,由于非聚簇索引的row_id是系统自动生成的只增加序列,这个时候就会都往一个region里面开始写入数据,就会产生写入热点的问题。
  2. SHARD_ROW_ID_BITS是预分区,它只是一个逻辑的概念,PRE_SPLIT_REGIONS是建表以后就直接生成对应的region,减少数据插入的时候生成region的时间。 
  3. 如果表是自增的主键的时候,也会出现数据插入热点的问题。

分区表

 

自增主键的原理

 

使用限制

 

自增主键解决数据热点问题

 

原理

 

后面的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 |
+-----------+----------------------------+------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工作变成艺术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值