MySQL 8.4 參考手冊  /  ...  /  子分割區

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 分割區。這也稱為複合分割區

注意

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