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

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
            )
        );