### 24.2.6 子分区

[](<>)[](<>)

子分区（也称为复合分区）是对分区表中每个分区的进一步划分。考虑以下[`创建表`](create-table.html)陈述：

```
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`范围`分区。这些分区中的每一个——`p0`,`p1`， 和`p2`— 进一步分为 2 个子分区。实际上，整个表被划分为`3 * 2 = 6`分区。然而，由于行动`按范围划分`子句，其中的前 2 个仅存储值小于 1990 的记录`购买`柱子。

[](<>)

可以对按以下方式分区的表进行子分区`范围`要么`列表`.子分区可以使用`哈希`要么`钥匙`分区。这也称为复合分区。

笔记

`哈希分区`和`按键分割`通常遵循相同的语法规则`哈希分区`和`按键分区`， 分别。一个例外是`按键分割`（不像`按键分区`) 当前不支持默认列，因此必须指定用于此目的的列，即使表具有显式主键。这是我们正在努力解决的已知问题；看[子分区的问题](partitioning-limitations.html#partitioning-limitations-subpartitions)，了解更多信息和示例。

[](<>)

也可以使用显式定义子分区`子分区`子句指定各个子分区的选项。例如，创建同一个表的更详细的方式`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
        )
    );
```

此处列出了一些需要注意的语法项：

-   每个分区必须具有相同数量的子分区。

-   如果您使用显式定义任何子分区`子分区`在分区表的任何分区上，您必须全部定义它们。换句话说，以下语句失败：

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

    即使使用了这个语句，它仍然会失败`子分区 2`.

-   每个`子分区`子句必须包括（至少）子分区的名称。否则，您可以为子分区设置任何所需的选项，或者允许它采用该选项的默认设置。

-   子分区名称在整个表中必须是唯一的。例如，以下[`创建表`](create-table.html)声明有效：

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