與分割相關的子句,用於 ALTER TABLE
,可與分割表格搭配使用,以進行重新分割、新增、刪除、捨棄、匯入、合併和分割分割區,並執行分割維護。
僅在分割表格上使用
partition_options
子句與ALTER TABLE
,會根據partition_options
定義的分割方案重新分割表格。此子句一律以PARTITION BY
開頭,並遵循與CREATE TABLE
的partition_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] KEY
的ALGORITHM
選項。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 或更高版本的伺服器上建立以KEY
或LINEAR 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 PARTITION
的partition_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
可用於刪除一個或多個RANGE
或LIST
分割區。此陳述式不能與HASH
或KEY
分割區一起使用;請改用COALESCE PARTITION
(請參閱本節稍後部分)。partition_names
清單中命名的已刪除分割區中儲存的任何資料都會被捨棄。例如,假設之前定義的表格t1
,您可以刪除名為p0
和p1
的分割區,如下所示ALTER TABLE t1 DROP PARTITION p0, p1;
注意DROP PARTITION
不適用於使用NDB
儲存引擎的表格。請參閱 第 26.3.1 節,「RANGE 和 LIST 分割區的管理」,以及 第 25.2.7 節,「NDB Cluster 的已知限制」。ADD PARTITION
和DROP PARTITION
目前不支援IF [NOT] EXISTS
。DISCARD PARTITION ... TABLESPACE
和IMPORT PARTITION ... TABLESPACE
選項將可攜式表格空間功能延伸到個別的InnoDB
表格分割區。每個InnoDB
表格分割區都有其自己的表格空間檔案(.ibd
檔案)。可攜式表格空間功能可讓您輕鬆地將表格空間從執行中的 MySQL 伺服器執行個體複製到另一個執行中的執行個體,或在同一個執行個體上執行還原。這兩個選項都採用以逗號分隔的一個或多個分割區名稱清單。例如ALTER TABLE t1 DISCARD PARTITION p2, p3 TABLESPACE;
ALTER TABLE t1 IMPORT PARTITION p2, p3 TABLESPACE;
在子分割表格上執行
DISCARD PARTITION ... TABLESPACE
和IMPORT 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
條件。例如,此陳述式會刪除分割區p1
和p3
中的所有資料列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
可與依HASH
或KEY
分割的表格搭配使用,以將分割區數量減少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 會自動提供預設名稱
p0
、p1
、p2
等等。子分割區的情況也是如此。如需關於
ALTER TABLE ... REORGANIZE PARTITION
陳述式的詳細資訊和範例,請參閱 第 26.3.1 節,「RANGE 和 LIST 分割區的管理」。若要將表格分割區或子分割區與表格交換,請使用
ALTER TABLE ... EXCHANGE PARTITION
陳述式—也就是說,將分割區或子分割區中的任何現有資料列移至未分割的表格,並將未分割表格中的任何現有資料列移至表格分割區或子分割區。一旦使用
ALGORITHM=INSTANT
將一個或多個資料行新增至分割表格後,就無法再與該表格交換分割區。如需使用資訊和範例,請參閱 第 26.3.3 節,「使用表格交換分割區和子分割區」。
有幾個選項提供分割維護和修復功能,類似於
CHECK TABLE
和REPAIR TABLE
等陳述式針對未分割表格實作的功能(這些陳述式也支援分割表格;如需詳細資訊,請參閱 第 15.7.3 節,「表格維護陳述式」)。這些包括ANALYZE PARTITION
、CHECK PARTITION
、OPTIMIZE PARTITION
、REBUILD PARTITION
和REPAIR PARTITION
。這些選項中的每一個選項都會採用一個partition_names
子句,其中包含一個或多個以逗號分隔的分割區名稱。分割區必須已存在於目標表格中。您也可以使用ALL
關鍵字來取代partition_names
,在這種情況下,陳述式會對所有表格分割區執行動作。如需詳細資訊和範例,請參閱 第 26.3.4 節,「分割區的維護」。目前
InnoDB
不支援針對每個分割區進行最佳化;ALTER TABLE ... OPTIMIZE PARTITION
會導致重建並分析整個表格,並發出適當的警告。(錯誤 #11751825,錯誤 #42822)要解決此問題,請改用ALTER TABLE ... REBUILD PARTITION
和ALTER TABLE ... ANALYZE PARTITION
。對於未分割的表格,不支援
ANALYZE PARTITION
、CHECK PARTITION
、OPTIMIZE PARTITION
和REPAIR PARTITION
選項。REMOVE PARTITIONING
可讓您移除表格的分割,而不會以其他方式影響表格或其資料。此選項可以與其他ALTER TABLE
選項組合使用,例如用於新增、刪除或重新命名欄或索引的選項。使用
ALTER TABLE
的ENGINE
選項會變更表格使用的儲存引擎,而不會影響分割。目標儲存引擎必須提供自己的分割處理常式。只有InnoDB
和NDB
儲存引擎具有原生的分割處理常式。
ALTER TABLE
陳述式可以包含 PARTITION BY
或 REMOVE PARTITIONING
子句,以及其他 alter 規格,但 PARTITION BY
或 REMOVE PARTITIONING
子句必須在任何其他規格之後最後指定。
ADD PARTITION
、DROP PARTITION
、COALESCE PARTITION
、REORGANIZE PARTITION
、ANALYZE PARTITION
、CHECK PARTITION
和 REPAIR PARTITION
選項不能在單一 ALTER TABLE
中與其他 alter 規格組合使用,因為剛剛列出的選項會作用於個別的分割區。如需更多資訊,請參閱第 15.1.9.1 節,「ALTER TABLE 分割區操作」。
在指定的 ALTER TABLE
陳述式中,下列選項中只能使用單一執行個體:PARTITION BY
、ADD PARTITION
、DROP PARTITION
、TRUNCATE PARTITION
、EXCHANGE PARTITION
、REORGANIZE PARTITION
或 COALESCE PARTITION
、ANALYZE PARTITION
、CHECK PARTITION
、OPTIMIZE PARTITION
、REBUILD PARTITION
、REMOVE PARTITIONING
。
例如,下列兩個陳述式是無效的
ALTER TABLE t1 ANALYZE PARTITION p1, ANALYZE PARTITION p2;
ALTER TABLE t1 ANALYZE PARTITION p1, CHECK PARTITION p2;
在第一種情況下,您可以使用單一陳述式與列出要分析的兩個分割區的單一 ANALYZE PARTITION
選項,同時分析表格 t1
的分割區 p1
和 p2
,如下所示
ALTER TABLE t1 ANALYZE PARTITION p1, p2;
在第二種情況下,無法同時對同一個表格的不同分割區執行 ANALYZE
和 CHECK
操作。您必須改為發出兩個獨立的陳述式,如下所示
ALTER TABLE t1 ANALYZE PARTITION p1;
ALTER TABLE t1 CHECK PARTITION p2;
目前不支援針對子分割區執行 REBUILD
操作。子分割區明確不允許使用 REBUILD
關鍵字,如果這樣使用,會導致 ALTER TABLE
失敗並出現錯誤。
當要檢查或修復的分割區包含任何重複鍵錯誤時,CHECK PARTITION
和 REPAIR PARTITION
操作將會失敗。
如需有關這些陳述式的更多資訊,請參閱第 26.3.4 節,「分割區的維護」。