表属性

表属性是 TiDB 从 5.3.0 版本开始引入的新特性,用于为表或分区添加特定的属性,以对表或分区执行相应属性对应的操作,例如可以利用表属性控制 Region 的合并。

使用方法

表属性为 key=value 的形式,多个属性需要用逗号分隔。具体示例如下,其中 t 为所要修改的表名,p 为所要修改的分区名,[]内部为可选项。

  • 设置表或分区属性

    ALTER TABLE t [PARTITION p] ATTRIBUTES [=] 'key=value[, key1=value1...]';
  • 重置表或分区属性

    ALTER TABLE t [PARTITION p] ATTRIBUTES [=] DEFAULT;
  • 查看全部表及分区属性

    SELECT * FROM information_schema.attributes;
  • 查看某一张表或分区配置的属性

    SELECT * FROM information_schema.attributes WHERE id='schema/t[/p]';
  • 查看拥有某属性的所有表及分区

    SELECT * FROM information_schema.attributes WHERE attributes LIKE '%key%';

覆盖关系

为分区表配置的属性会对表的所有分区生效。一种例外情况是,如果分区表和分区都配置了相同属性但属性值不同,分区属性将覆盖分区表属性。例如,当分区表 t 配置属性 key=value,同时分区 p 配置属性 key=value1 时:

ALTER TABLE t ATTRIBUTES[=]'key=value'; ALTER TABLE t PARTITION p ATTRIBUTES[=]'key=value1';

分区 p 实际生效的属性为 key=value1

使用表属性控制 Region 合并

使用场景

当写入或读取数据存在热点时,可以使用表属性控制 Region 合并,通过为表或分区添加 merge_option 属性,将其设置为 deny 来解决。以下介绍了两种使用场景。

新建表或分区的写入热点问题

在对某张新建表或某个新建分区写入数据存在热点问题时,通常需要使用分裂打散 Region 的操作避免写入热点,但由于新建表或分区的分裂操作实际产生的是空 Region,如果分裂打散操作距离写入存在一定时间间隔,则 Region 可能会被合并,从而导致无法真正规避写入热点问题。此时可以为表或分区添加 merge_option 属性,设置为 deny 来解决问题。

只读场景下周期性读热点问题

在只读场景下,如果是通过手动分裂 Region 缓解某张表或分区的周期性读热点问题,且不希望热点消失后手动分裂的 Region 被合并。此时可以为表或分区添加 merge_option 属性,设置为 deny 来解决问题。

使用方法

使用方法如下,其中 t 为所要修改的表名,p 为所要修改的分区名。

  • 禁止属于某个表的 Region 被合并

    ALTER TABLE t ATTRIBUTES 'merge_option=deny';
  • 允许属于某个表的 Region 被合并

    ALTER TABLE t ATTRIBUTES 'merge_option=allow';
  • 重置某个表的属性

    ALTER TABLE t ATTRIBUTES DEFAULT;
  • 禁止属于某个分区的 Region 被合并

    ALTER TABLE t PARTITION p ATTRIBUTES 'merge_option=deny';
  • 允许属于某个分区的 Region 被合并

    ALTER TABLE t PARTITION p attributes 'merge_option=allow';
  • 查看所有配置了 merge_option 属性的表或分区

    SELECT * FROM information_schema.attributes WHERE attributes LIKE '%merge_option%';

覆盖关系

ALTER TABLE t ATTRIBUTES 'merge_option=deny'; ALTER TABLE t PARTITION p ATTRIBUTES 'merge_option=allow';

同时配置上述两个属性时,实际分区 p 的 Region 可以被合并。当分区的属性被重置时,分区 p 则会继承表 t 的属性,Region 无法被合并。