Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 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 子句的作用,前 2 个分区只存储 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 在任何分区表的任何分区上明确地定义了子分区,那么您必须定义所有子分区。在其他 words,以下语句将失败:

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