文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  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 選項組合使用,例如用於新增、刪除或重新命名欄或索引的選項。

  • 使用 ALTER TABLEENGINE 選項會變更表格使用的儲存引擎,而不會影響分割。目標儲存引擎必須提供自己的分割處理常式。只有 InnoDBNDB 儲存引擎具有原生的分割處理常式。

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

ADD PARTITIONDROP PARTITIONCOALESCE PARTITIONREORGANIZE PARTITIONANALYZE PARTITIONCHECK PARTITIONREPAIR PARTITION 選項不能在單一 ALTER TABLE 中與其他 alter 規格組合使用,因為剛剛列出的選項會作用於個別的分割區。如需更多資訊,請參閱第 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 節,「分割區的維護」