26.2.6 子分区
子分区(也称为复合分区)是将每个分区进一步划分的过程。在考虑以下CREATE TABLE
语句时:
CREATE TABLE ts (id INT, purchased DATE)
PARTITION BY RANGE( YEAR(purchased) )
SUBPARTITION BY HASH( TO_DAYS(purchased) )
SUBPARTITIONS 2 (
PARTITION p0 VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (2000),
PARTITION p2 VALUES LESS THAN MAXVALUE
);
表格 ts
有 3 个 RANGE
分区。每个这些分区——p0
、p1
和 p2
——进一步划分为 2 个子分区。在实际操作中,这整个表格被划分成了 3 * 2 = 6
个分区。然而,由于 PARTITION BY RANGE
子句的作用,前两个这些存储了仅在 purchased
列中值小于 1990 的记录。
可以对使用 RANGE
或 LIST
分区的表进行子分区。子分区可以使用 HASH
或 KEY
分区。这也被称为 复合分区。
SUBPARTITION BY HASH
和 SUBPARTITION BY KEY
通常遵循与 PARTITION BY HASH
和 PARTITION BY KEY
相同的语法规则。一个例外是,SUBPARTITION BY KEY
(与 PARTITION BY KEY
不同)目前不支持默认列,因此用于此目的的列必须被指定,即使表格有显式主键。这是一个已知的问题,我们正在努力解决;请参阅子分区问题,获取更多信息和示例。
还可以使用 SUBPARTITION
子句来为每个子分区定义选项。例如,对于表格 ts
的同一创建方式,可以采用更详细的方法:
CREATE TABLE ts (id INT, purchased DATE)
PARTITION BY RANGE( YEAR(purchased) )
SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
PARTITION p0 VALUES LESS THAN (1990) (
SUBPARTITION s0,
SUBPARTITION s1
),
PARTITION p1 VALUES LESS THAN (2000) (
SUBPARTITION s2,
SUBPARTITION s3
),
PARTITION p2 VALUES LESS THAN MAXVALUE (
SUBPARTITION s4,
SUBPARTITION s5
)
);
以下是一些语法上的注意事项:
-
每个分区必须有相同数量的子分区。
-
如果您在任何分区中使用
SUBPARTITION
明确定义了子分区,则必须为所有分区定义它们。换句话说,这个语句失败:CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) SUBPARTITION BY HASH( TO_DAYS(purchased) ) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0, SUBPARTITION s1 ), PARTITION p1 VALUES LESS THAN (2000), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s2, SUBPARTITION s3 ) );
即使它使用了
SUBPARTITIONS 2
,这个语句仍然会失败。 -
每个
SUBPARTITION
子句必须至少包含子分区的名称。否则,您可以为子分区设置任何所需选项或让其采用该选项的默认设置。 -
子分区名在整个表格中必须是唯一的。例如,这个
CREATE TABLE
语句是有效的:CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) SUBPARTITION BY HASH( TO_DAYS(purchased) ) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0, SUBPARTITION s1 ), PARTITION p1 VALUES LESS THAN (2000) ( SUBPARTITION s2, SUBPARTITION s3 ), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s4, SUBPARTITION s5 ) );