PolarDB-X的Range类型分区,可细分为Range分区与Range Columns分区两种。同样, Range分区和Range Columns分区属于原生MySQL的标准分区语法。这两种分区的使用区别如下表所示。
| 分区策略 | 分区键支持 | 是否支持分区函数 | 语法示例 | 特点与限制 | 路由描述(点查) |
|---|---|---|---|---|---|
| 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进行分区分裂解决热点)。 |
|
| Range | 单列分区键 | 是 | PARTITION BY RANGE(YEAR(c1)) ( PARTITION p1 VALUES LESS THAN (2019), PARTITION p2 VALUES LESS THAN (2021) ...) |
|
|
示例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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




