MySQL 8.4 Reference Manual  /  ...  /  Subpartitioning

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 子句的作用,前两个这些存储了仅在 purchased 列中值小于 1990 的记录。

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

Note

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