TiDB按日期分区的最佳方案

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:3.0.9
  • 【问题描述】:我们有一个表数据是按日期存放的,主要的查询也是按日期查询,每个date的数据量大概有100多万,我想把这张表按照date字段分区(每天一个分区),请问:
  1. 每日一个分区是否可行,我们会存放几年的数据,TiDB对于分区数是否有限制?
  2. 如果根据date字段设置每日一个分区只能手动设置range分区吗?有没有更方便的按日期分区的方式?
  3. 如果我们按照date字段每日一个分区存储,那相邻日期的数据是连续的吗?我如果读一段时间段的数据会慢吗?
  4. hash分区是否支持分区裁剪?
  5. between查询,>,<,>=,<=的范围查询是否支持分区裁剪?

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

您好: 预格式化文本

  1. 每日一个分区是否可行,我们会存放几年的数据,TiDB对于分区数是否有限制? — >不限制
  2. 如果根据date字段设置每日一个分区只能手动设置range分区吗?有没有更方便的按日期分区的方式? —>需要手动设置
  3. 如果我们按照date字段每日一个分区存储,那相邻日期的数据是连续的吗?我如果读一段时间段的数据会慢吗? —> 一个分区本质上可以看作一张表,它在存储层有新的 table id,所以分区之间不保证连续
  4. hash分区是否支持分区裁剪? —> 支持,但是多列最好不要使用
  5. between查询,>,<,>=,<=的范围查询是否支持分区裁剪? —>range分区支持,hash不支持

请参考文档中的一些介绍 https://pingcap.com/docs-cn/stable/reference/sql/partitioning/#分区表

谢谢回复!

如果我按照月来做分区,每个月的数据大概3000W~5000W,100G左右,那对于读写的性能会有影响吗?TiDB底层本身还有region的概念,那是不是单表很大的情况下性能下降也不会很厉害?

如果不是列数非常多的宽表几百列,一个月3000w-5000w应该没有什么问题的, 当前有些分区表好像一天应该就有1亿的数据了.

好的,那应该问题不大,我们的表最多的也就20多列。

谢谢!

:handshake: