文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 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 參考手冊  /  ...  /  線上 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 9.0 中的預設演算法。

    INSTANT 演算法加入欄時,適用下列限制

    • 陳述式無法將加入欄與其他不支援 INSTANT 演算法的 ALTER TABLE 動作結合。

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

    • 無法將欄加入使用 ROW_FORMAT=COMPRESSED 的表格、具有 FULLTEXT 索引的表格、位於資料字典表格空間中的表格或臨時表格。臨時表格僅支援 ALGORITHM=COPY

    • INSTANT 演算法加入欄時,MySQL 會檢查列大小,如果加入的大小超過限制,則會擲回下列錯誤。

      錯誤 4092 (HY000):無法使用 ALGORITHM=INSTANT 加入欄,因為加入後最大可能列大小會超過最大允許列大小。請嘗試 ALGORITHM=INPLACE/COPY。

    • 使用 INSTANT 演算法加入欄後,表格的內部表示法中的最大欄數不能超過 1022。錯誤訊息為

      錯誤 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 演算法重建表格。

    錯誤 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 9.0 中的預設演算法。

    當使用 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 演算法重建表格。

    錯誤 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 欄位,則需要兩個長度位元組。因此,就地 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 索引的資料表。

  • 執行「null」重建

    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 章分割區