MySQL 8.0 参考手册  / 第24章分区  / 24.2 分区类型  /  24.2.6 子分区

24.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 分区。这些分区p0中的每一个—— p1、 和—— 都p2进一步分为 2 个子分区。实际上,整个表被划分为多个 3 * 2 = 6分区。但是,由于PARTITION BY RANGE子句的作用,前 2 个只存储列中值小于 1990 的那些记录purchased

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

笔记

SUBPARTITION BY HASH和 通常分别遵循与和 SUBPARTITION BY KEY相同的语法规则。一个例外是(与 不同)当前不支持默认列,因此必须指定用于此目的的列,即使该表具有显式主键。这是一个我们正在努力解决的已知问题;有关更多信息和示例, 请参阅 子分区问题。PARTITION BY HASHPARTITION BY KEYSUBPARTITION BY KEYPARTITION 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
            )
        );