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

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