暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

AUTO模式的Range类型

酷数据库 2023-09-14
172

PolarDB-X的Range类型分区,可细分为Range分区与Range Columns分区两种。同样, Range分区和Range Columns分区属于原生MySQL的标准分区语法。这两种分区的使用区别如下表所示。

表 2. Range Columns分区策略与Range分区策略对比
分区策略分区键支持是否支持分区函数语法示例特点与限制路由描述(点查)
Range Columns单列分区键& 向量分区键PARTITION BY RANGE COLUMNS (c1,c2,...,cn) ( PARTITION p1 VALUES LESS THAN (1,10,...,1000), PARTITION p2 VALUES LESS THAN (2,20,...,2000) ...)支持热点分裂(例如c1有热点值88,可以使用c2进行分区分裂解决热点)。
  1. (c1,c2,...,cn)这N个列的值组成一组分区键向量;
  2. 根据这个分区键向量(c1,c2,...,cn)按二分查找算法判断它属于哪个预定义分区,并最终路由到目标分区。
Range单列分区键PARTITION BY RANGE(YEAR(c1)) ( PARTITION p1 VALUES LESS THAN (2019), PARTITION p2 VALUES LESS THAN (2021) ...)
  • 不支持热点分裂;
  • 目前支持的分区函数:
    • YEAR
    • MONTH
    • DAYOFMONTH
    • DAYOFWEEK
    • DAYOFYEAR
    • TO_DAYS
    • TO_MONTHS
    • TO_WEEKS
    • TO_SECONDS
    • UNIX_TIMESTAMP
    • SUBSTR/SUBSTRING
  1. 按c1列的值,使用YEAR分区函数计算其对应的年份year;
  2. 年份year按二分查找算法判断它属于哪个预定义分区,并路由到目标分区。

示例2-1:Range Columns分区

Range Columns分区支持使用向量分区键,但它不支持使用分区函数。例如,业务可以按订单ID与订单日期进行Range分区, 可以使用以下的建表语法:


CREATE TABLE orders(
 order_id int,
 order_time datetime not null)
PARTITION BY range columns(order_id,order_time)
(
  PARTITION p1 VALUES LESS THAN (10000,'2021-01-01'),
  PARTITION p2 VALUES LESS THAN (20000,'2021-01-01'),
  PARTITION p3 VALUES LESS THAN (30000,'2021-01-01'),
  PARTITION p4 VALUES LESS THAN (40000,'2021-01-01'),
  PARTITION p5 VALUES LESS THAN (50000,'2021-01-01'),
  PARTITION p6 VALUES LESS THAN (MAXVALUE,MAXVALUE)
);

重要

目前Range Columns分区不支持使用TIMESTAMP/TIME等与时区相关的类型作为分区键。

示例2-2:Range分区

Range分区仅支持单列分区健,但对于时间类型的分区列,它支持使用分区函数(例如YEAR/TO_DAYS/TO_SECONDS/MONTH等)来将时间类型转换成整数类型。

重要

Range分区是不支持直接使用字符串类型作为分区列。

例如,业务想按订单的日期order_time列进行Range分区,并且每个季度一个分区,建表语法如下所示:


CREATE TABLE orders_todays(
 id int,
 order_time datetime not null)
PARTITION BY RANGE(to_days(order_time))
(
  PARTITION p1 VALUES LESS THAN (to_days('2021-01-01')),
  PARTITION p2 VALUES LESS THAN (to_days('2021-04-01')),
  PARTITION p3 VALUES LESS THAN (to_days('2021-07-01')),
  PARTITION p4 VALUES LESS THAN (to_days('2021-10-01')),
  PARTITION p5 VALUES LESS THAN (to_days('2022-01-01')),
  PARTITION p6 VALUES LESS THAN (MAXVALUE)
);

重要

目前Range分区仅支持使用整数类型作为分区键,且分区键仅支持1个分区列。

相关限制

  • 数据类型限制
    • 整数类型: BIGINT/BIGINT UNSINGEDINT/INT/INT UNSINGED/MEDIUMINT/MEDIUMINT UNSINGED/SMALLINT/SMALLINT UNSINGED/TINYINT/TINYINT UNSINGED;
    • 时间类型:DATETIME/DATE;
    • 字符串类型:CHAR/VARCHAR。
  • 语法限制
    • Range Columns分区与Range分区都不支持使用NULL值作为边界值;
    • Range Columns分区目前不支的使用TIMESTAMP类型;
    • Range分区仅支持整数类型,若分区键使用TIMESTAMP类型,必须配套使用分区函数UNIX_TIMESTAMP确保时区一致;
    • Range的分区不支持热点分列;
    • 查询时,NULL值查询会被当作最小值进行分区路由;
    • 默认最大分区数目不允许超过8192个;
    • 默认最大分区列数目不允许超过5个。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论