MySQL 8.0 リファレンスマニュアル


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 パーティションがあります。 これらの各パーティション (p0p1、および p2) は、さらに 2 つのサブパーティションに分割されます。 実際には、テーブル全体が 3 * 2 = 6 パーティションに分割されます。 ただし、PARTITION BY RANGE 句のアクションによって、これらの最初の 2 つには purchased カラムで値が 1990 より小さいレコードのみが格納されます。

RANGE または LIST でパーティション化されたテーブルをサブパーティション化できます。 サブパーティショニングには、HASH または KEY パーティショニングを使用できます。 これは、複合パーティショニングとも呼ばれます。

注記

SUBPARTITION BY HASH および SUBPARTITION BY KEY は通常それぞれ、PARTITION BY HASH および PARTITION 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
            )
        );

関連キーワード:  SUBPARTITION, PARTITION, パーティショニング, purchased, VALUES, LESS, THAN, サブパーティショニング, RANGE, HASH