INTERVAL RANGE是RANGE分区的扩展,当新插入的数据超过现有分区的范围时,该分区允许数据库自动创建新分区。

前提条件

集群版本需为PolarDB MySQL版8.0.2版本且Revision version为8.0.2.2.0及以上。您可以通过查询版本号确认集群版本。

简介

向RANGE分区表插入数据时,如果插入的数据超出当前已存在分区的范围,将无法插入并且会返回错误;而对于INTERVAL RANGE分区表,当新插入的数据超过现有分区的范围时,允许数据库自动创建新分区,根据INTERVAL子句指定的范围来新增分区。

如果分区范围设置为1个月,新插入的数据为当前转换点(当前存在的分区的最大边界值)两个月后的数据,将会创建该数据所在月份的分区,以及中间月份的分区。例如,您可以创建一个INTERVAL RANGE分区表,该表分区范围为1个月且当前的转换点为2021年9月15日。如果您尝试为2021年12月10日插入数据,那么将创建2021年9月15日至12月15日所需的3个分区,并将数据插入该分区。

使用限制

  • INTERVAL RANGE分区使用COLUMNS只能指定单个分区键,该键必须是数字或日期范围。
  • 必须定义至少一个RANGE分区。
  • INTERVAL RANGE分区表的分区只按递增顺序创建。
  • 如果分区键为DATE类型,INTERVAL的类型不能是TIME类型(HOUR、MINUTE、SECOND);如果分区键为TIME类型,INTERVAL的类型不能是DATE类型(YEAR、QUARTER、MONTH、WEEK、DAY);如果分区键不是时间类型,INTERVAL不能指定类型,使用默认类型;指定的间隔大小必须是正整数,如果类型是SECOND,间隔不能小于60。
  • 暂时不支持通过INSERT SELECT和UPDATE新增分区。
  • 暂时不支持改变建表时定义的间隔。
  • 暂时不支持定义二级分区。
  • 通过LOAD DATA导入数据时需要保证当前分区表的分区范围可以覆盖所有数据。
  • 不支持通过TRIGGER、STORED FUNCTION、STORED PROCEDURE向INTERVAL RANGE分区插入数据。
  • 不支持LOCK TABLES。
  • 不支持分区键是AUTO_INCREMENT、virtual column、generated default column;不支持分区键是STRING类型。
  • 用户自己定义分区的命名不能用_p作为分区名的前缀(包括建表以及DDL)。
  • 自动增加的分区,一旦创建成功,不支持回滚。
  • 在通过INSERT语句自动增加分区的同时,执行另外的DDL语句,有可能导致检测到死锁而报错。

使用方法

您可以通过设置如下参数开启或设置INTERVAL RANGE功能。
参数名称参数说明
partition_level_mdl_enabled目前INTERVAL RANGE是基于PARTITION Level MDL这个功能来实现的,这样做的好处是可以借助这个更小粒度的MDL,来减少DDL对DML的影响。因此,使用INTERVAL RANGE功能需要保证partition_level_mdl_enabled参数为开启状态。如果这个参数关闭,将不能新建INTERVAL RANGE分区表,对于已经存在的INTERVAL RANGE分区表,只能插入符合当前已存在分区的范围的值,插入分区范围以外的值会报错。
interval_partitioning_enabledinterval_partitioning_enabled参数用来单独控制INTERVAL RANGE功能,而partition_level_mdl_enabled参数是PARTITION Level MDL功能的控制参数,这2个参数都会制约INTERVAL RANGE功能的使用,缺一不可。使用INTERVAL RANGE功能,在开启partition_level_mdl_enabled参数的基础上,需要保证interval_partitioning_enabled参数为开启状态。如果这个参数关闭,将不能新建INTERVAL RANGE分区表,对于已经存在的INTERVAL RANGE分区表,只能插入符合当前已存在分区的范围的值,插入分区范围以外的值会报错。
transaction_isolation由于PARTITION Level MDL功能限制隔离级别只能为READ-COMMITTED或READ-UNCOMMITTED,所以该参数要与PARTITION Level MDL功能的限制隔离级别保持一致。当前线上集群默认为READ-COMMITTED隔离级别。