MySQL 9.0 参考手册  /  ...  /  子分区

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 分区。这些分区中的每一个(p0p1p2)都被进一步划分为 2 个子分区。实际上,整个表被分成了 3 * 2 = 6 个分区。但是,由于 PARTITION BY RANGE 子句的作用,前 2 个分区只存储 purchased 列中值小于 1990 的记录。

可以对按 RANGELIST 分区的表进行子分区。子分区可以使用 HASHKEY 分区。这也称为复合分区

注意

SUBPARTITION BY HASHSUBPARTITION BY KEY 通常遵循与 PARTITION BY HASHPARTITION 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
            )
        );