文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式 Letter) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  ALTER TABLE 分割區操作

15.1.9.1 ALTER TABLE 分割區操作

與分割區相關的 ALTER TABLE 子句可用於分割表格,以進行重新分割、新增、刪除、捨棄、匯入、合併和分割分割區,以及執行分割區維護。

  • 單純地在分割資料表上使用 partition_options 子句與 ALTER TABLE,會根據 partition_options 定義的分割方案重新分割資料表。此子句總是從 PARTITION BY 開始,並遵循與 CREATE TABLEpartition_options 子句相同的語法和其他規則 (如需更詳細資訊,請參閱 第 15.1.20 節,「CREATE TABLE 陳述式」),也可以用於分割尚未分割的現有資料表。例如,考慮一個 (未分割) 資料表,定義如下:

    CREATE TABLE t1 (
        id INT,
        year_col INT
    );

    此資料表可以使用 HASH 進行分割,以 id 資料行為分割鍵,透過以下陳述式分割成 8 個分割區:

    ALTER TABLE t1
        PARTITION BY HASH(id)
        PARTITIONS 8;

    MySQL 支援 [SUB]PARTITION BY [LINEAR] KEYALGORITHM 選項。ALGORITHM=1 會使伺服器在計算資料列在分割區中的位置時,使用與 MySQL 5.1 相同的鍵雜湊函數;ALGORITHM=2 表示伺服器採用 MySQL 5.5 和更新版本中,用於新 KEY 分割資料表的預設鍵雜湊函數。(使用 MySQL 5.5 和更新版本中使用的鍵雜湊函數建立的分割資料表,不能由 MySQL 5.1 伺服器使用。) 未指定此選項的效果與使用 ALGORITHM=2 相同。此選項主要用於在 MySQL 5.1 和更新版本的 MySQL 版本之間升級或降級 [LINEAR] KEY 分割資料表,或用於在 MySQL 5.5 或更新版本的伺服器上建立以 KEYLINEAR KEY 分割的資料表,這些資料表可以在 MySQL 5.1 伺服器上使用。

    使用 ALTER TABLE ... PARTITION BY 陳述式產生的資料表,必須遵循與使用 CREATE TABLE ... PARTITION BY 建立的資料表相同的規則。這包括任何唯一鍵 (包括資料表可能具有的任何主鍵) 與分割運算式中使用的資料行之間的關係規則,如 第 26.6.1 節,「分割鍵、主鍵和唯一鍵」中所述。CREATE TABLE ... PARTITION BY 中指定分割區數量的規則也適用於 ALTER TABLE ... PARTITION BY

    ALTER TABLE ADD PARTITIONpartition_definition 子句支援與 CREATE TABLE 陳述式同名的子句相同的選項。(如需語法和說明,請參閱 第 15.1.20 節,「CREATE TABLE 陳述式」)。假設您有如下所示建立的分割資料表:

    CREATE TABLE t1 (
        id INT,
        year_col INT
    )
    PARTITION BY RANGE (year_col) (
        PARTITION p0 VALUES LESS THAN (1991),
        PARTITION p1 VALUES LESS THAN (1995),
        PARTITION p2 VALUES LESS THAN (1999)
    );

    您可以為此資料表新增一個新的分割區 p3,以儲存小於 2002 的值,如下所示:

    ALTER TABLE t1 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2002));

    DROP PARTITION 可以用來捨棄一個或多個 RANGELIST 分割區。此陳述式不能與 HASHKEY 分割區一起使用;而是使用 COALESCE PARTITION (請參閱本節稍後內容)。儲存在 partition_names 清單中指定的已捨棄分割區中的任何資料都會被捨棄。例如,假設先前定義的資料表 t1,您可以捨棄名為 p0p1 的分割區,如下所示:

    ALTER TABLE t1 DROP PARTITION p0, p1;
    注意

    DROP PARTITION 不適用於使用 NDB 儲存引擎的資料表。請參閱 第 26.3.1 節,「RANGE 和 LIST 分割區的管理」第 25.2.7 節,「NDB Cluster 的已知限制」

    ADD PARTITIONDROP PARTITION 目前不支援 IF [NOT] EXISTS

    DISCARD PARTITION ... TABLESPACEIMPORT PARTITION ... TABLESPACE 選項將 可傳輸表格空間 功能延伸到個別 InnoDB 資料表分割區。每個 InnoDB 資料表分割區都有自己的表格空間檔案 (.ibd 檔案)。可傳輸表格空間 功能可讓您輕鬆地將表格空間從執行中的 MySQL 伺服器執行個體複製到另一個執行中的執行個體,或在同一個執行個體上執行還原。這兩個選項都採用以逗號分隔的一個或多個分割區名稱清單。例如:

    ALTER TABLE t1 DISCARD PARTITION p2, p3 TABLESPACE;
    ALTER TABLE t1 IMPORT PARTITION p2, p3 TABLESPACE;

    在子分割資料表上執行 DISCARD PARTITION ... TABLESPACEIMPORT PARTITION ... TABLESPACE 時,允許使用分割區和子分割區名稱。指定分割區名稱時,會包含該分割區的子分割區。

    可傳輸表格空間 功能也支援複製或還原分割的 InnoDB 資料表。如需詳細資訊,請參閱 第 17.6.1.3 節,「匯入 InnoDB 資料表」

    支援重新命名分割的資料表。您可以使用 ALTER TABLE ... REORGANIZE PARTITION 間接重新命名個別分割區;但是,此作業會複製分割區的資料。

    若要從選定的分割區中刪除資料列,請使用 TRUNCATE PARTITION 選項。此選項會採用以逗號分隔的一個或多個分割區名稱清單。請考慮由下列陳述式建立的資料表 t1

    CREATE TABLE t1 (
        id INT,
        year_col INT
    )
    PARTITION BY RANGE (year_col) (
        PARTITION p0 VALUES LESS THAN (1991),
        PARTITION p1 VALUES LESS THAN (1995),
        PARTITION p2 VALUES LESS THAN (1999),
        PARTITION p3 VALUES LESS THAN (2003),
        PARTITION p4 VALUES LESS THAN (2007)
    );

    若要從分割區 p0 中刪除所有資料列,請使用下列陳述式:

    ALTER TABLE t1 TRUNCATE PARTITION p0;

    剛才顯示的陳述式與下列 DELETE 陳述式的效果相同:

    DELETE FROM t1 WHERE year_col < 1991;

    截斷多個分割區時,分割區不必是連續的:這可以大幅簡化分割資料表上的刪除作業,否則如果使用 DELETE 陳述式,則需要非常複雜的 WHERE 條件。例如,此陳述式會刪除分割區 p1p3 中的所有資料列:

    ALTER TABLE t1 TRUNCATE PARTITION p1, p3;

    對等的 DELETE 陳述式如下所示:

    DELETE FROM t1 WHERE
        (year_col >= 1991 AND year_col < 1995)
        OR
        (year_col >= 2003 AND year_col < 2007);

    如果您使用 ALL 關鍵字來取代分割區名稱的清單,則陳述式會對所有資料表分割區執行動作。

    TRUNCATE PARTITION 只會刪除資料列;它不會變更資料表本身或任何分割區的定義。

    若要驗證是否已捨棄資料列,請使用如下查詢來檢查 INFORMATION_SCHEMA.PARTITIONS 資料表:

    SELECT PARTITION_NAME, TABLE_ROWS
        FROM INFORMATION_SCHEMA.PARTITIONS
        WHERE TABLE_NAME = 't1';

    COALESCE PARTITION 可以與使用 HASHKEY 分割的資料表一起使用,以將分割區數量減少 number。假設您已建立資料表 t2,如下所示:

    CREATE TABLE t2 (
        name VARCHAR (30),
        started DATE
    )
    PARTITION BY HASH( YEAR(started) )
    PARTITIONS 6;

    若要將 t2 使用的分割區數量從 6 個減少到 4 個,請使用下列陳述式:

    ALTER TABLE t2 COALESCE PARTITION 2;

    最後 number 個分割區中包含的資料會合併到其餘的分割區中。在此案例中,分割區 4 和 5 會合併到前 4 個分割區 (編號為 0、1、2 和 3 的分割區) 中。

    若要變更分割資料表所使用的一部分 (而非全部) 分割區,可以使用 REORGANIZE PARTITION。此陳述式可以透過數種方式使用:

    • 將一組分割區合併為單一分割區。方法是在 partition_names 清單中命名數個分割區,並提供 partition_definition 的單一定義。

    • 將現有的分割區分割成數個分割區。方法是為 partition_names 命名單一分割區,並提供多個 partition_definitions

    • 變更使用 VALUES LESS THAN 定義的分割區子集的範圍,或變更使用 VALUES IN 定義的分割區子集的值清單。

    注意

    對於未明確命名的分割區,MySQL 會自動提供預設名稱 p0p1p2 等等。子分割區的情況也是如此。

    如需有關 ALTER TABLE ... REORGANIZE PARTITION 陳述式的更詳細資訊和範例,請參閱 第 26.3.1 節,「RANGE 和 LIST 分割區的管理」

  • 若要將資料表分割區或子分割區與資料表交換,請使用 ALTER TABLE ... EXCHANGE PARTITION 陳述式,也就是說,將分割區或子分割區中的任何現有資料列移動到未分割的資料表,並將未分割資料表中的任何現有資料列移動到資料表分割區或子分割區。

    一旦使用 ALGORITHM=INSTANT 將一個或多個資料行新增到分割資料表後,就不再可能與該資料表交換分割區。

    如需使用資訊和範例,請參閱 第 26.3.3 節,「將分割區和子分割區與資料表交換」

  • 數個選項提供分割區維護和修復功能,類似於 CHECK TABLEREPAIR TABLE 等陳述式針對未分割的資料表實作的功能 (也支援用於分割的資料表;如需詳細資訊,請參閱 第 15.7.3 節,「資料表維護陳述式」)。這些包括 ANALYZE PARTITIONCHECK PARTITIONOPTIMIZE PARTITIONREBUILD PARTITIONREPAIR PARTITION。這些選項的每一個都採用一個 partition_names 子句,其中包含一個或多個分割區名稱,並以逗號分隔。分割區必須已經存在於目標資料表中。您也可以使用 ALL 關鍵字來取代 partition_names,在這種情況下,陳述式會對所有資料表分割區執行動作。如需詳細資訊和範例,請參閱 第 26.3.4 節,「分割區的維護」

    InnoDB 目前不支援每個分割區的最佳化;ALTER TABLE ... OPTIMIZE PARTITION 會導致重建和分析整個資料表,並發出適當的警告。(錯誤 #11751825,錯誤 #42822) 若要解決此問題,請改用 ALTER TABLE ... REBUILD PARTITIONALTER TABLE ... ANALYZE PARTITION

    不支援對未分割的資料表使用 ANALYZE PARTITIONCHECK PARTITIONOPTIMIZE PARTITIONREPAIR PARTITION 選項。

  • REMOVE PARTITIONING 可讓您移除資料表的分割區,而不會以其他方式影響資料表或其資料。此選項可以與其他 ALTER TABLE 選項結合使用,例如用於新增、捨棄或重新命名資料行或索引的選項。

  • 使用 ENGINE 選項搭配 ALTER TABLE 會變更資料表使用的儲存引擎,而不會影響分割區。目標儲存引擎必須提供自己的分割區處理程式。只有 InnoDBNDB 儲存引擎具有原生分割區處理程式。

ALTER TABLE 陳述式有可能包含 PARTITION BYREMOVE PARTITIONING 子句,以及其他變更規格,但 PARTITION BYREMOVE PARTITIONING 子句必須在任何其他規格之後最後指定。

ADD PARTITIONDROP PARTITIONCOALESCE PARTITIONREORGANIZE PARTITIONANALYZE PARTITIONCHECK PARTITIONREPAIR PARTITION 選項不能與單一 ALTER TABLE 中的其他變更規格合併使用,因為所列出的選項僅針對個別分割區執行。有關更多資訊,請參閱 第 15.1.9.1 節,「ALTER TABLE 分割區操作」

在給定的 ALTER TABLE 陳述式中,下列選項中的任何一個都只能使用單一實例:PARTITION BYADD PARTITIONDROP PARTITIONTRUNCATE PARTITIONEXCHANGE PARTITIONREORGANIZE PARTITIONCOALESCE PARTITIONANALYZE PARTITIONCHECK PARTITIONOPTIMIZE PARTITIONREBUILD PARTITIONREMOVE PARTITIONING

例如,以下兩個陳述式無效

ALTER TABLE t1 ANALYZE PARTITION p1, ANALYZE PARTITION p2;

ALTER TABLE t1 ANALYZE PARTITION p1, CHECK PARTITION p2;

在第一種情況下,您可以使用單一 ANALYZE PARTITION 選項同時分析資料表 t1 的分割區 p1p2,該選項會列出要分析的兩個分割區,如下所示

ALTER TABLE t1 ANALYZE PARTITION p1, p2;

在第二種情況下,無法同時對同一個資料表的不同分割區執行 ANALYZECHECK 操作。您必須改為發出兩個單獨的陳述式,如下所示

ALTER TABLE t1 ANALYZE PARTITION p1;
ALTER TABLE t1 CHECK PARTITION p2;

目前不支援對子分割區執行 REBUILD 操作。明確禁止在子分割區中使用 REBUILD 關鍵字,如果這樣使用,會導致 ALTER TABLE 失敗並出現錯誤。

當要檢查或修復的分割區包含任何重複鍵錯誤時,CHECK PARTITIONREPAIR PARTITION 操作會失敗。

有關這些陳述式的更多資訊,請參閱 第 26.3.4 節,「分割區的維護」