子分区(也称为 复合分区)是对分区表中每个分区的进一步划分。请考虑以下 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
子句的作用,前 2 个分区只存储 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 ) );