一个月2亿的数据,如果想按年分区的话,表应该怎么设计呢。

一张表,每月大概会有2亿的数据,时间较近的数据会被频繁查,较久的数据则会偶尔查。出于成本的考虑,现在想把表做成分区表,按时间字段来分,到时候可以直接按年drop分区,维护起来比较方便。但是分区键要求必须包含主键,这就意味着我要么不指定主键,要么得把主键放在分区键里。这里的最佳实践是什么呢?没有主键觉得不稳妥,有主键的话分区又不好分。

3 Likes

如果我不指定主键, SHARD_ROW_ID_BITS设置为4好,还是6好呢。
https://docs.pingcap.com/zh/tidb/stable/shard-row-id-bits

一般主键就是逻辑上的唯一键了
另外会选择一个时间维度,这样子联合起来就能满足做分区了

PK + Time = Key
Rang(Time) partition xxxx

如果场景有较高的性能要求,推荐使用 autodom_id (聚簇索引),实现数据自动打散
不用考虑 shard_row_id_bits 的方式

1 Like

SHARD_ROW_ID_BITS 指定的位数越多打散效果越好,网络请求、CPU消耗也会越多。初始建表时开启scatter_region变量+pre_split_regions才能将预切分的region打散到各tikv。另目前分区表中表关联是不支持indexjoin可能会导致全表扫描。 5.1版本后有个动态分区裁剪实验特性,开启后可以走index join

1 Like

但是目前不建议在生产环境中使用动态分区裁剪功能。分区表感觉现在还不是很成熟,那我目前的诉求就是把老数据迁出去,不用分区表的话,是不是只能做备份后,再用delete删了?有没有一些其他的方案呢?

range hash分区还是比较成熟的,只能尽量避免表关联或每次都指定分区条件,delete太慢 mvcc版本太多影响性能。

这里的分区条件指的是分区的patition名称呢还是分区的字段呢。

分区字段,能使用静态裁剪

如果我指定分区的话,是不是就可以当成单表那样子用了。

对就是一个大单表,可能就得需要做定时任务删除历史数据,可以频率较高些,避免一次删除过多数据,造成性能问题

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