文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手冊頁 (TGZ) - 258.5Kb
手冊頁 (Zip) - 365.5Kb
資訊 (Gzip) - 4.0Mb
資訊 (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  線上 DDL 操作

17.12.1 線上 DDL 操作

本章節中的以下主題提供了 DDL 操作的線上支援詳細資訊、語法範例和使用注意事項。

索引操作

下表提供了索引操作線上 DDL 支援的概述。星號表示其他資訊、例外情況或相依性。如需詳細資訊,請參閱語法和使用注意事項

表格 17.15 索引操作的線上 DDL 支援

操作 即時 就地 重建表格 允許並行 DML 僅修改中繼資料
建立或新增次要索引
刪除索引
重新命名索引
新增 FULLTEXT 索引 是* 否*
新增 SPATIAL 索引
變更索引類型

語法和使用注意事項
  • 建立或新增次要索引

    CREATE INDEX name ON table (col_list);
    ALTER TABLE tbl_name ADD INDEX name (col_list);

    在建立索引時,表格仍然可用於讀取和寫入操作。CREATE INDEX 陳述式只有在存取表格的所有交易完成後才會完成,以便索引的初始狀態反映表格的最新內容。

    新增次要索引的線上 DDL 支援表示您通常可以透過先建立沒有次要索引的表格,然後在載入資料後新增次要索引,來加速建立和載入表格和相關索引的整體流程。

    新建立的次要索引僅包含執行CREATE INDEXALTER TABLE 陳述式完成時表格中已提交的資料。它不包含任何未提交的值、舊版本的值或標記為刪除但尚未從舊索引中移除的值。

    有些因素會影響此操作的效能、空間使用和語意。詳細資訊請參閱第 17.12.8 節,「線上 DDL 限制」

  • 刪除索引

    DROP INDEX name ON table;
    ALTER TABLE tbl_name DROP INDEX name;

    在捨棄索引的同時,表格仍然可供讀取和寫入操作。只有在存取表格的所有交易完成後,DROP INDEX 陳述式才會完成,以便索引的初始狀態反映表格的最新內容。

  • 重新命名索引

    ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name, ALGORITHM=INPLACE, LOCK=NONE;
  • 新增 FULLTEXT 索引

    CREATE FULLTEXT INDEX name ON table(column);

    如果沒有使用者定義的 FTS_DOC_ID 欄位,則新增第一個 FULLTEXT 索引會重建表格。可以在不重建表格的情況下新增其他 FULLTEXT 索引。

  • 新增 SPATIAL 索引

    CREATE TABLE geom (g GEOMETRY NOT NULL);
    ALTER TABLE geom ADD SPATIAL INDEX(g), ALGORITHM=INPLACE, LOCK=SHARED;
  • 變更索引類型 (USING {BTREE | HASH})

    ALTER TABLE tbl_name DROP INDEX i1, ADD INDEX i1(key_part,...) USING BTREE, ALGORITHM=INSTANT;

主鍵操作

下表概述了主鍵操作的線上 DDL 支援。星號表示其他資訊、例外情況或相依性。請參閱語法和使用注意事項

表 17.16 主鍵操作的線上 DDL 支援

操作 即時 就地 重建表格 允許並行 DML 僅修改中繼資料
新增主鍵 是* 是*
捨棄主鍵
捨棄主鍵並新增另一個

語法和使用注意事項
  • 新增主鍵

    ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;

    在原地重建表格。資料會大幅重組,使其成為昂貴的操作。如果必須將欄位轉換為 NOT NULL,則在某些條件下不允許使用 ALGORITHM=INPLACE

    重新建構叢集索引始終需要複製表格資料。因此,最好在建立表格時定義主鍵,而不是稍後發出 ALTER TABLE ... ADD PRIMARY KEY

    當您建立 UNIQUEPRIMARY KEY 索引時,MySQL 必須執行一些額外的工作。對於 UNIQUE 索引,MySQL 會檢查表格是否包含索引鍵的重複值。對於 PRIMARY KEY 索引,MySQL 還會檢查 PRIMARY KEY 欄位中是否沒有任何欄位包含 NULL

    當您使用 ALGORITHM=COPY 子句新增主鍵時,MySQL 會將相關欄位中的 NULL 值轉換為預設值:數字為 0,字元型欄位和 BLOB 為空字串,以及 DATETIME 為 0000-00-00 00:00:00。這是一種非標準行為,Oracle 建議您不要依賴此行為。僅當 SQL_MODE 設定包含 strict_trans_tablesstrict_all_tables 旗標時,才允許使用 ALGORITHM=INPLACE 新增主鍵;當 SQL_MODE 設定為嚴格時,允許使用 ALGORITHM=INPLACE,但如果要求的主鍵欄位包含 NULL 值,則陳述式仍然可能會失敗。ALGORITHM=INPLACE 行為更符合標準。

    如果您建立的表格沒有主鍵,InnoDB 會為您選擇一個主鍵,它可以是定義在 NOT NULL 欄位上的第一個 UNIQUE 索引鍵,或是一個系統產生的索引鍵。為避免不確定性以及額外隱藏欄位的潛在空間需求,請將 PRIMARY KEY 子句指定為 CREATE TABLE 陳述式的一部分。

    MySQL 會建立新的叢集索引,方法是將現有資料從原始表格複製到具有所需索引結構的暫存表格。一旦資料完全複製到暫存表格,原始表格就會以不同的暫存表格名稱重新命名。包含新叢集索引的暫存表格會以原始表格的名稱重新命名,原始表格則會從資料庫中捨棄。

    適用於次要索引操作的線上效能增強功能不適用於主鍵索引。InnoDB 表格的列儲存在根據主鍵組織的叢集索引中,形成某些資料庫系統所謂的「索引組織表」。由於表格結構與主鍵密切相關,因此重新定義主鍵仍然需要複製資料。

    當主鍵上的操作使用 ALGORITHM=INPLACE 時,即使資料仍會被複製,它也比使用 ALGORITHM=COPY 更有效率,因為

    • 對於 ALGORITHM=INPLACE,不需要復原記錄或相關的重做記錄。這些操作會增加使用 ALGORITHM=COPY 的 DDL 陳述式的負擔。

    • 次要索引項目已預先排序,因此可以依序載入。

    • 不使用變更緩衝區,因為沒有隨機存取插入次要索引。

  • 捨棄主鍵

    ALTER TABLE tbl_name DROP PRIMARY KEY, ALGORITHM=COPY;

    只有 ALGORITHM=COPY 支援在同一個 ALTER TABLE 陳述式中捨棄主鍵而不新增新的主鍵。

  • 捨棄主鍵並新增另一個

    ALTER TABLE tbl_name DROP PRIMARY KEY, ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;

    資料會大幅重組,使其成為昂貴的操作。

欄位操作

下表概述了欄位操作的線上 DDL 支援。星號表示其他資訊、例外情況或相依性。詳細資訊請參閱語法和使用注意事項

表 17.17 欄位操作的線上 DDL 支援

操作 即時 就地 重建表格 允許並行 DML 僅修改中繼資料
新增欄位 是* 否* 是*
捨棄欄位 是*
重新命名欄位 是* 是*
重新排序欄位
設定欄位預設值
變更欄位資料類型
擴充 VARCHAR 欄位大小
捨棄欄位預設值
變更自動遞增值 否*
將欄位設為 NULL 是*
將欄位設為 NOT NULL 是* 是*
修改 ENUMSET 欄位的定義

語法和使用注意事項
  • 新增欄位

    ALTER TABLE tbl_name ADD COLUMN column_name column_definition, ALGORITHM=INSTANT;

    INSTANT 是 MySQL 8.4 中的預設演算法。

    INSTANT 演算法新增欄位時,適用以下限制

    • 陳述式不能將新增欄位與其他不支援 INSTANT 演算法的 ALTER TABLE 動作合併。

    • INSTANT 演算法可以在表格中的任何位置新增欄位。

    • 無法將欄位新增至使用 ROW_FORMAT=COMPRESSED 的表格、具有 FULLTEXT 索引的表格、位於資料字典表空間中的表格或暫存表格。暫存表格僅支援 ALGORITHM=COPY

    • INSTANT 演算法新增欄位時,MySQL 會檢查列大小,如果新增超出限制,則會擲回以下錯誤。

      ERROR 4092 (HY000): 無法使用 ALGORITHM=INSTANT 新增欄位,因為新增後,最大可能的列大小會超過允許的最大列大小。請嘗試 ALGORITHM=INPLACE/COPY。

    • 使用 INSTANT 演算法新增欄位後,表格內部表示中的最大欄位數不能超過 1022。錯誤訊息如下

      ERROR 4158 (HY000): 無法再使用 ALGORITHM=INSTANT 將欄位新增至 tbl_name。請嘗試 ALGORITHM=INPLACE/COPY

    • INSTANT 演算法無法將欄位新增或捨棄至系統綱要表格,例如內部 mysql 表格。

    • 無法使用 INSTANT 演算法捨棄具有函數索引的欄位。

    可以在同一個 ALTER TABLE 陳述式中新增多個欄位。例如

    ALTER TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT, ALGORITHM=INSTANT;

    在每個 ALTER TABLE ... ALGORITHM=INSTANT 操作後,都會建立新的列版本,該操作會新增一或多個欄位、捨棄一或多個欄位,或在同一個操作中新增和捨棄一或多個欄位。INFORMATION_SCHEMA.INNODB_TABLES.TOTAL_ROW_VERSIONS 欄位會追蹤表格的列版本數。每次即時新增或捨棄欄位時,值都會遞增。初始值為 0。

    mysql>  SELECT NAME, TOTAL_ROW_VERSIONS FROM INFORMATION_SCHEMA.INNODB_TABLES 
            WHERE NAME LIKE 'test/t1';
    +---------+--------------------+
    | NAME    | TOTAL_ROW_VERSIONS |
    +---------+--------------------+
    | test/t1 |                  0 |
    +---------+--------------------+

    當透過表格重建的 ALTER TABLE OPTIMIZE TABLE 操作重建具有即時新增或捨棄欄位的表格時,TOTAL_ROW_VERSIONS 值會重設為 0。允許的最大列版本數為 64,因為每個列版本都需要額外的表格中繼資料空間。當達到列版本限制時,使用 ALGORITHM=INSTANTADD COLUMNDROP COLUMN 操作會遭到拒絕,並顯示錯誤訊息,建議使用 COPYINPLACE 演算法重建表格。

    ERROR 4080 (HY000): 表格 test/t1 已達到最大列版本數。無法再即時新增或捨棄欄位。請使用 COPY/INPLACE。

    以下 INFORMATION_SCHEMA 欄位提供即時新增欄位的其他中繼資料。如需詳細資訊,請參閱這些欄位的說明。請參閱第 28.4.9 節,「INFORMATION_SCHEMA INNODB_COLUMNS 表格」第 28.4.23 節,「INFORMATION_SCHEMA INNODB_TABLES 表格」

    • INNODB_COLUMNS.DEFAULT_VALUE

    • INNODB_COLUMNS.HAS_DEFAULT

    • INNODB_TABLES.INSTANT_COLS

    新增自動遞增欄位時,不允許並行 DML。資料會大幅重組,使其成為昂貴的操作。至少需要 ALGORITHM=INPLACE, LOCK=SHARED

    如果使用 ALGORITHM=INPLACE 新增欄位,則會重建表格。

  • 捨棄欄位

    ALTER TABLE tbl_name DROP COLUMN column_name, ALGORITHM=INSTANT;

    INSTANT 是 MySQL 8.4 中的預設演算法。

    當使用 INSTANT 演算法捨棄欄位時,適用以下限制

    • 捨棄欄位不能在同一個陳述式中與其他不支援 ALGORITHM=INSTANTALTER TABLE 動作合併。

    • 無法從使用 ROW_FORMAT=COMPRESSED 的表格、具有 FULLTEXT 索引的表格、位於資料字典表空間中的表格或暫存表格中捨棄欄位。暫存表格僅支援 ALGORITHM=COPY

    可以在同一個 ALTER TABLE 陳述式中捨棄多個欄位;例如

    ALTER TABLE t1 DROP COLUMN c4, DROP COLUMN c5, ALGORITHM=INSTANT;

    每次使用 ALGORITHM=INSTANT 新增或捨棄欄位時,都會建立新的列版本。INFORMATION_SCHEMA.INNODB_TABLES.TOTAL_ROW_VERSIONS 欄位會追蹤表格的列版本數。每次即時新增或捨棄欄位時,值都會遞增。初始值為 0。

    mysql>  SELECT NAME, TOTAL_ROW_VERSIONS FROM INFORMATION_SCHEMA.INNODB_TABLES 
            WHERE NAME LIKE 'test/t1';
    +---------+--------------------+
    | NAME    | TOTAL_ROW_VERSIONS |
    +---------+--------------------+
    | test/t1 |                  0 |
    +---------+--------------------+

    當透過表格重建的 ALTER TABLE OPTIMIZE TABLE 操作重建具有即時新增或捨棄欄位的表格時,TOTAL_ROW_VERSIONS 值會重設為 0。允許的最大列版本數為 64,因為每個列版本都需要額外的表格中繼資料空間。當達到列版本限制時,使用 ALGORITHM=INSTANTADD COLUMNDROP COLUMN 操作會遭到拒絕,並顯示錯誤訊息,建議使用 COPYINPLACE 演算法重建表格。

    ERROR 4080 (HY000): 表格 test/t1 已達到最大列版本數。無法再即時新增或捨棄欄位。請使用 COPY/INPLACE。

    如果使用 ALGORITHM=INSTANT 以外的演算法,則資料會大幅重組,使其成為昂貴的操作。

  • 重新命名欄位

    ALTER TABLE tbl CHANGE old_col_name new_col_name data_type, ALGORITHM=INSTANT;

    若要允許並行 DML,請保持相同的資料類型,並僅變更欄位名稱。

    當您保持相同的資料類型和 [NOT] NULL 屬性,僅變更欄位名稱時,此操作始終可以在線上執行。

    只有使用 ALGORITHM=INPLACE 時,才允許重新命名被其他表格參考的欄位。如果您使用 ALGORITHM=INSTANTALGORITHM=COPY,或其他導致該操作使用這些演算法的條件,則 ALTER TABLE 語句將會失敗。

    ALGORITHM=INSTANT 支援重新命名虛擬欄位;而 ALGORITHM=INPLACE 則不支援。

    當在同一個語句中新增或刪除虛擬欄位時,ALGORITHM=INSTANTALGORITHM=INPLACE 都不支援重新命名欄位。在這種情況下,僅支援 ALGORITHM=COPY

  • 重新排序欄位

    若要重新排序欄位,請在 CHANGEMODIFY 操作中使用 FIRSTAFTER

    ALTER TABLE tbl_name MODIFY COLUMN col_name column_definition FIRST, ALGORITHM=INPLACE, LOCK=NONE;

    資料會大幅重組,使其成為昂貴的操作。

  • 變更欄位資料類型

    ALTER TABLE tbl_name CHANGE c1 c1 BIGINT, ALGORITHM=COPY;

    只有使用 ALGORITHM=COPY 時才支援變更欄位的資料類型。

  • 擴充 VARCHAR 欄位大小

    ALTER TABLE tbl_name CHANGE COLUMN c1 c1 VARCHAR(255), ALGORITHM=INPLACE, LOCK=NONE;

    VARCHAR 欄位所需的長度位元組數必須保持不變。對於大小為 0 到 255 位元組的 VARCHAR 欄位,需要一個長度位元組來編碼該值。對於大小為 256 位元組或更大的 VARCHAR 欄位,則需要兩個長度位元組。因此,就地 (In-place) ALTER TABLE 僅支援將 VARCHAR 欄位大小從 0 增加到 255 位元組,或從 256 位元組增加到更大的大小。就地 ALTER TABLE 不支援將 VARCHAR 欄位的大小從小於 256 位元組增加到等於或大於 256 位元組的大小。在這種情況下,所需的長度位元組數會從 1 變為 2,這僅在表格複製 (ALGORITHM=COPY) 時才支援。例如,嘗試使用就地 ALTER TABLE 將單一位元組字元集的 VARCHAR 欄位大小從 VARCHAR(255) 變更為 VARCHAR(256) 會傳回此錯誤。

    ALTER TABLE tbl_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256);
    ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change
    column type INPLACE. Try ALGORITHM=COPY.
    請注意

    VARCHAR 欄位的位元組長度取決於字元集的位元組長度。

    不支援使用就地 ALTER TABLE 縮減 VARCHAR 的大小。縮減 VARCHAR 的大小需要表格複製 (ALGORITHM=COPY)。

  • 設定欄位預設值

    ALTER TABLE tbl_name ALTER COLUMN col SET DEFAULT literal, ALGORITHM=INSTANT;

    僅修改表格的中繼資料。預設的欄位值儲存在資料字典中。

  • 刪除欄位的預設值

    ALTER TABLE tbl ALTER COLUMN col DROP DEFAULT, ALGORITHM=INSTANT;
  • 變更自動遞增值

    ALTER TABLE table AUTO_INCREMENT=next_value, ALGORITHM=INPLACE, LOCK=NONE;

    修改儲存在記憶體中的值,而不是資料檔案。

    在使用複寫或分片的分散式系統中,您有時會將表格的自動遞增計數器重設為特定值。下一個插入表格中的資料列,其自動遞增欄位將會使用指定的值。您也可能在資料倉儲環境中使用此技術,在該環境中,您會定期清空所有表格並重新載入它們,然後從 1 重新啟動自動遞增序列。

  • 將欄位設為 NULL

    ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NULL, ALGORITHM=INPLACE, LOCK=NONE;

    就地重建表格。資料會被大幅度地重新組織,使其成為一個耗費資源的操作。

  • 將欄位設為 NOT NULL

    ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NOT NULL, ALGORITHM=INPLACE, LOCK=NONE;

    就地重建表格。操作成功需要 STRICT_ALL_TABLESSTRICT_TRANS_TABLES SQL_MODE。如果欄位包含 NULL 值,則操作會失敗。伺服器禁止變更可能導致參考完整性喪失的外來鍵欄位。請參閱第 15.1.9 節「ALTER TABLE 語句」。資料會被大幅度地重新組織,使其成為一個耗費資源的操作。

  • 修改 ENUMSET 欄位的定義

    CREATE TABLE t1 (c1 ENUM('a', 'b', 'c'));
    ALTER TABLE t1 MODIFY COLUMN c1 ENUM('a', 'b', 'c', 'd'), ALGORITHM=INSTANT;

    藉由將新的列舉或集合成員新增至有效成員值清單的結尾,來修改 ENUMSET 欄位的定義,只要資料類型的儲存大小沒有變更,就可以立即或就地執行。例如,將成員新增至具有 8 個成員的 SET 欄位,會將每個值所需的儲存空間從 1 個位元組變更為 2 個位元組;這需要表格複製。在清單中間新增成員會導致現有成員重新編號,這需要表格複製。

產生的欄位操作

下表概述了產生的欄位操作的線上 DDL 支援。如需詳細資訊,請參閱語法和用法注意事項

表 17.18 產生的欄位操作的線上 DDL 支援

操作 即時 就地 重建表格 允許並行 DML 僅修改中繼資料
新增 STORED 欄位
修改 STORED 欄位順序
刪除 STORED 欄位
新增 VIRTUAL 欄位
修改 VIRTUAL 欄位順序
刪除 VIRTUAL 欄位

語法和用法注意事項
  • 新增 STORED 欄位

    ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) STORED), ALGORITHM=COPY;

    ADD COLUMN 對於已儲存的欄位而言,不是就地操作 (不會使用暫存表格執行),因為必須由伺服器評估運算式。

  • 修改 STORED 欄位順序

    ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED FIRST, ALGORITHM=COPY;

    就地重建表格。

  • 刪除 STORED 欄位

    ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INPLACE, LOCK=NONE;

    就地重建表格。

  • 新增 VIRTUAL 欄位

    ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL), ALGORITHM=INSTANT;

    對於未分割的表格,可以立即或就地執行新增虛擬欄位。

    對於已分割的表格,新增 VIRTUAL 不是就地操作。

  • 修改 VIRTUAL 欄位順序

    ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL FIRST, ALGORITHM=COPY;
  • 刪除 VIRTUAL 欄位

    ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INSTANT;

    對於未分割的表格,可以立即或就地執行刪除 VIRTUAL 欄位。

外來鍵操作

下表概述了外來鍵操作的線上 DDL 支援。星號表示其他資訊、例外或相依性。如需詳細資訊,請參閱語法和用法注意事項

表 17.19 外來鍵操作的線上 DDL 支援

操作 即時 就地 重建表格 允許並行 DML 僅修改中繼資料
新增外來鍵約束 是*
刪除外來鍵約束

語法和用法注意事項
  • 新增外來鍵約束

    foreign_key_checks 停用時,支援 INPLACE 演算法。否則,僅支援 COPY 演算法。

    ALTER TABLE tbl1 ADD CONSTRAINT fk_name FOREIGN KEY index (col1)
      REFERENCES tbl2(col2) referential_actions;
  • 刪除外來鍵約束

    ALTER TABLE tbl DROP FOREIGN KEY fk_name;

    無論是否啟用 foreign_key_checks 選項,都可以線上執行刪除外來鍵。

    如果您不知道特定表格的外來鍵約束名稱,請發出下列語句,並在每個外來鍵的 CONSTRAINT 子句中找到約束名稱。

    SHOW CREATE TABLE table\G

    或者,查詢 Information Schema TABLE_CONSTRAINTS 表格,並使用 CONSTRAINT_NAMECONSTRAINT_TYPE 欄位來識別外來鍵名稱。

    您也可以在單一語句中刪除外來鍵及其相關聯的索引。

    ALTER TABLE table DROP FOREIGN KEY constraint, DROP INDEX index;
請注意

如果正在變更的表格中已存在外來鍵 (也就是說,它是一個包含 FOREIGN KEY ... REFERENCE 子句的子表格),即使是那些不直接涉及外來鍵欄位的線上 DDL 操作,也會受到額外的限制。

  • 如果父表格的變更,透過使用 CASCADESET NULL 參數的 ON UPDATEON DELETE 子句,導致子表格中產生相關的變更,則子表格上的 ALTER TABLE 可能會等待另一個交易提交。

  • 同樣地,如果表格是外來鍵關係中的父表格,即使它不包含任何 FOREIGN KEY 子句,如果 INSERTUPDATEDELETE 語句在子表格中產生 ON UPDATEON DELETE 動作,則它可能會等待 ALTER TABLE 完成。

表格操作

下表概述了表格操作的線上 DDL 支援。星號表示其他資訊、例外或相依性。如需詳細資訊,請參閱語法和用法注意事項

表 17.20 表格操作的線上 DDL 支援

操作 即時 就地 重建表格 允許並行 DML 僅修改中繼資料
變更 ROW_FORMAT
變更 KEY_BLOCK_SIZE
設定永久表格統計資料
指定字元集 是*
轉換字元集 是*
最佳化表格 是*
使用 FORCE 選項重建 是*
執行空值重建 是*
重新命名表格

語法和用法注意事項
  • 變更 ROW_FORMAT

    ALTER TABLE tbl_name ROW_FORMAT = row_format, ALGORITHM=INPLACE, LOCK=NONE;

    資料會大幅重組,使其成為昂貴的操作。

    如需關於 ROW_FORMAT 選項的更多資訊,請參閱表格選項

  • 變更 KEY_BLOCK_SIZE

    ALTER TABLE tbl_name KEY_BLOCK_SIZE = value, ALGORITHM=INPLACE, LOCK=NONE;

    資料會大幅重組,使其成為昂貴的操作。

    如需關於 KEY_BLOCK_SIZE 選項的更多資訊,請參閱表格選項

  • 設定永久表格統計資料選項

    ALTER TABLE tbl_name STATS_PERSISTENT=0, STATS_SAMPLE_PAGES=20, STATS_AUTO_RECALC=1, ALGORITHM=INPLACE, LOCK=NONE;

    僅修改表格的中繼資料。

    永久統計資料包括 STATS_PERSISTENTSTATS_AUTO_RECALCSTATS_SAMPLE_PAGES。如需更多資訊,請參閱第 17.8.10.1 節「設定永久最佳化工具統計資料參數」

  • 指定字元集

    ALTER TABLE tbl_name CHARACTER SET = charset_name, ALGORITHM=INPLACE, LOCK=NONE;

    如果新的字元編碼不同,則會重建表格。

  • 轉換字元集

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name, ALGORITHM=COPY;

    如果新的字元編碼不同,則會重建表格。

  • 最佳化表格

    OPTIMIZE TABLE tbl_name;

    具有 FULLTEXT 索引的表格不支援就地操作。該操作會使用 INPLACE 演算法,但不允許使用 ALGORITHMLOCK 語法。

  • 使用 FORCE 選項重建表格

    ALTER TABLE tbl_name FORCE, ALGORITHM=INPLACE, LOCK=NONE;

    從 MySQL 5.6.17 開始,使用 ALGORITHM=INPLACEALGORITHM=INPLACE 不支援具有 FULLTEXT 索引的表格。

  • 執行「空值」重建

    ALTER TABLE tbl_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;

    從 MySQL 5.6.17 開始,使用 ALGORITHM=INPLACEALGORITHM=INPLACE 不支援具有 FULLTEXT 索引的表格。

  • 重新命名表格

    ALTER TABLE old_tbl_name RENAME TO new_tbl_name, ALGORITHM=INSTANT;

    可以立即或就地執行重新命名表格。MySQL 會重新命名對應於表格 tbl_name 的檔案,而不會建立複本。(您也可以使用 RENAME TABLE 語句來重新命名表格。請參閱第 15.1.36 節「RENAME TABLE 語句」。)專門針對已重新命名表格授與的權限不會移轉到新的名稱。它們必須手動變更。

表格空間操作

下表概述了對表空間操作的線上 DDL 支援。詳細資訊請參閱語法和使用注意事項

表 17.21 表空間操作的線上 DDL 支援

操作 即時 就地 重建表格 允許並行 DML 僅修改中繼資料
重新命名一般表空間
啟用或停用一般表空間加密
啟用或停用每個表檔案表空間加密

語法和使用注意事項

分割區操作

除了某些 ALTER TABLE 分割區子句之外,分割的 InnoDB 表格的線上 DDL 操作遵循與一般 InnoDB 表格相同的規則。

某些 ALTER TABLE 分割區子句不會經過與一般非分割的 InnoDB 表格相同的內部線上 DDL API。因此,對於 ALTER TABLE 分割區子句的線上支援會有所不同。

下表顯示每個 ALTER TABLE 分割區陳述式的線上狀態。無論使用哪個線上 DDL API,MySQL 都會盡可能減少資料複製和鎖定。

使用 ALGORITHM=COPY 或僅允許 ALGORITHM=DEFAULT, LOCK=DEFAULTALTER TABLE 分割區選項會使用 COPY 演算法重新分割表格。換句話說,會使用新的分割區方案建立新的分割表格。新建立的表格會包含 ALTER TABLE 陳述式套用的任何變更,並且表格資料會複製到新的表格結構中。

表 17.22 分割區操作的線上 DDL 支援

分割區子句 即時 就地 允許 DML 注意事項
PARTITION BY 允許 ALGORITHM=COPYLOCK={DEFAULT|SHARED|EXCLUSIVE}
ADD PARTITION 是* 是* 針對 RANGELIST 分割區,支援 ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSISVE};針對 HASHKEY 分割區,支援 ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSISVE};針對所有分割區類型,支援 ALGORITHM=COPY, LOCK={SHARED|EXCLUSIVE}。對於由 RANGELIST 分割的表格,不會複製現有資料。對於由 HASHLIST 分割的表格,在使用 ALGORITHM=COPY 時,允許並行查詢,因為 MySQL 會在持有共用鎖定的情況下複製資料。
DROP PARTITION 是* 是*

支援 ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSIVE}。對於由 RANGELIST 分割的表格,不會複製資料。

使用 ALGORITHM=INPLACEDROP PARTITION 會刪除儲存在分割區中的資料,並捨棄分割區。然而,使用 ALGORITHM=COPYold_alter_table=ONDROP PARTITION 會重建分割表格,並嘗試將已捨棄分割區的資料移動到具有相容 PARTITION ... VALUES 定義的另一個分割區。無法移動到另一個分割區的資料會被刪除。

DISCARD PARTITION 僅允許 ALGORITHM=DEFAULTLOCK=DEFAULT
IMPORT PARTITION 僅允許 ALGORITHM=DEFAULTLOCK=DEFAULT
TRUNCATE PARTITION 不會複製現有資料。它只會刪除列;它不會變更表格本身或其任何分割區的定義。
COALESCE PARTITION 是* 支援 ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE}
REORGANIZE PARTITION 是* 支援 ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE}
EXCHANGE PARTITION
ANALYZE PARTITION
CHECK PARTITION
OPTIMIZE PARTITION 會忽略 ALGORITHMLOCK 子句。重建整個表格。請參閱第 26.3.4 節「分割區的維護」
REBUILD PARTITION 是* 支援 ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE}
REPAIR PARTITION
REMOVE PARTITIONING 允許 ALGORITHM=COPYLOCK={DEFAULT|SHARED|EXCLUSIVE}

分割表格的非分割區線上 ALTER TABLE 操作遵循與一般表格相同的規則。然而,ALTER TABLE 會對每個表格分割區執行線上操作,由於對多個分割區執行操作,導致對系統資源的需求增加。

如需有關 ALTER TABLE 分割區子句的其他資訊,請參閱分割區選項第 15.1.9.1 節「ALTER TABLE 分割區操作」。如需有關分割區的概括資訊,請參閱第 26 章「分割區