分区的现状与未来规划

  1. 背景

自 TiDB 3.0 版本发布以来,分区表功能就进入到各位 广大用户的视野中。使用用户越来越多,同时分区表上暴露出的问题也越来越明显,大家对分区表功能与性能上改进的呼声也越来越高。
通过在 AskTUG 与 Github Issue以及 PR 需求,和分区表相关问题需求的整理,给出了如下表格。希望通过这个表格让大家在使用分区表时候可以避开一些已知问题,快速的排雷高效使用 TiDB。

  1. 统计整理
图片

需求分类 问题 问题描述 问题 CASE 修复/实现版本 备注
查询过滤裁剪 LIKE / BETWEEN / IN / OR 查询多条记录不支持裁剪 在使用LIKE / BETWEEN / IN / OR 关键字对分区表的分区建进行 过滤查询时,不能有效对分区进行裁剪。而是使用的 全表扫描,使 SQL 效能降低 asktug-33789 v4.0.0 逐步交付 临时解决:可以尝试使用 Union ALL 替代
查询过滤裁剪 首分区无法被裁剪 在分区表上使用 分区键进行 range 查询 及时 range 范围不包含手分区,依然会被选中 #14158 asktug-639 v4.0.0 已交付
查询过滤裁剪 分区条件 f(x) op const,查询条件 g(x) op const,op 是大于小于无法裁剪 分区函数使用的 f(x) 函数,查询时候使用 g(x) 函数,且 运算符为 大于或小于,分区裁剪失效。 asktug-639 v4.0.0 已交付
查询过滤裁剪 Range 分区等值传递情况不能裁剪 查询条件没有直接使用分区列,但是有分区弄跟其它列的等值条件。如 : id 是分区列,如下查询应可以对分区表进行裁剪,select * from t where c = 1 and id = c; #20139 5.0 交付
分区表维护管理 表分区过多性能问题 表分区过多致使分区表统计信息收集异常。导致 TiDB CPU 到 100% #18325 5.0 交付
分区表维护管理 转换非分区表为分区表 将一张同构的普通表转换为分区表的一个分区 计划 6.0+ 交付
分区表维护管理 支持二级分区 支持在现有分区下设置子分区 计划 6.0+ 交付
分区表维护管理 便捷删除旧分区 目前删除分区通过分区 id 进行删除 asktug-33424 5.0 交付
分区表维护管理 Geo partition & Placement rule 配合 利用分区表指定不同 地区,优化查询端可以就近地域进行查询 #18199 #18030 5.0 交付
复杂查询支持 分区表支持 Index Join 在使用 Join 对分区表进行连接查询时,如果跨越多个分区,不能有效使用 index join asktug-35538 asktug-33191 5.0 交付 声明:由于代码逻辑属于重构,只在 v5.0.0 提供完整支持。在 v4.0.6 中单个分区可以使用 Indexjoin
丰富分区规则 唯一索引不包含分区键支持全局索引 唯一索引不需要是 partition key 的一部分 asktug-1904 预计 5.0 交付
丰富分区规则 BY LIST 按日期列的天属性取模到固定几个分区 支持 BY LIST 分区类型 asktug-2718 预计 5.0 交付
丰富分区规则 BY KEY 希望对非数字列进行 HASH 分区 支持 BY KEY 分区类型 asktug-32994 无计划
执行性能不佳 裁剪导致 sql compile 时间过长 (已知代码问题) V4.0.0 交付
执行性能不佳 分区表在非裁剪的情况下扫表太慢 诸如 select * from partition_table limit 1 ,未进行分区裁剪。 asktug-1117 asktug-2718 5.0 交付 使用 select * from partition_table t partition(p0) limit 1 指定分区进行查询
执行性能不佳 写入分区表热点问题 按天分区,非当天分区 presplit 的 region 被 merge,日期切换后形成热点 #16667 #18016 v4.0.5 交付
  1. Release List
    • v4.0 GA
      • 创建和更改表时新增检查分区表是否使用唯一前缀索引的功能 #17213
      • 分区表中支持 admin check indexadmin cleanup indexadmin recover index #17392 #17405 #17317
      • 修复 tidb_opt_agg_push_down 开启且聚合函数下推分区表信息时,由于逻辑处理不正确导致系统 panic 的问题 #17328
      • 修复 tidb_opt_agg_push_down 开启且聚合函数下推分区表信息时,由于逻辑处理不正确导致系统 panic 的问题 #17328
    • v4.0.5
      • 支持分区表的预打散功能 #17863
      • 修复 pre_split_regions 对分区表不生效的问题 #18837
      • 修复 Hash 分区表的分区键为整数类型时,写入 64 位无符号类型导致溢出 panic 的问题 #18186
      • 修复 ADMIN REPAIR TABLE 无法解析 range 分区表表达式中整数的问题 #17988
      • 修复 PointGetBatchPointGet 在分区表场景下报错的问题 #19141
    • v4.0.6
      • 提升分区表的写性能 #19649
      • 修复了分区表达式检查漏掉括号表达式的问题 #19614
      • 修复了当在分区表上将 Apply 转化成 HashJoin 时的错误结果 #19546
      • 支持在 Index Join 的 inner 端使用单个分区表 #19197
3赞

分区表的完善空间还有很大