本章節的下列主題提供 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 INDEX
或ALTER 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
。當您建立
UNIQUE
或PRIMARY 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_tables
或strict_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 |
否 | 是* | 是* | 是 | 否 |
修改 ENUM 或 SET 欄的定義 |
是 | 是 | 否 | 是 | 是 |
語法和使用注意事項
加入欄
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/COPYINSTANT
演算法無法將欄加入或捨棄至系統結構描述表格,例如內部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=INSTANT
的ADD COLUMN
和DROP COLUMN
操作,並顯示錯誤訊息,建議使用COPY
或INPLACE
演算法重建表格。錯誤 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=INSTANT
的ALTER 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=INSTANT
的ADD COLUMN
和DROP COLUMN
操作,並顯示錯誤訊息,建議使用COPY
或INPLACE
演算法重建表格。錯誤 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=INSTANT
、ALGORITHM=COPY
,或其他導致操作使用這些演算法的條件,則ALTER TABLE
陳述式會失敗。ALGORITHM=INSTANT
支援重新命名虛擬欄位;ALGORITHM=INPLACE
則不支援。當在同一個陳述式中新增或刪除虛擬欄位時,
ALGORITHM=INSTANT
和ALGORITHM=INPLACE
不支援重新命名欄位。在這種情況下,僅支援ALGORITHM=COPY
。重新排序欄
若要重新排序欄位,請在
CHANGE
或MODIFY
操作中使用FIRST
或AFTER
。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_TABLES
或STRICT_TRANS_TABLES
SQL_MODE
。如果欄位包含 NULL 值,則操作會失敗。伺服器禁止變更可能導致參考完整性遺失的外鍵欄位。請參閱第 15.1.9 節,〈ALTER TABLE 陳述式〉。資料會被大幅重新組織,使其成為耗費資源的操作。修改
ENUM
或SET
欄的定義CREATE TABLE t1 (c1 ENUM('a', 'b', 'c')); ALTER TABLE t1 MODIFY COLUMN c1 ENUM('a', 'b', 'c', 'd'), ALGORITHM=INSTANT;
只要資料類型的儲存大小不變,則可以在清單的有效成員值的結尾新增新的列舉或設定成員,以立即或就地執行修改
ENUM
或SET
欄位的定義。例如,為擁有 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 對外鍵操作的支援。星號表示其他資訊、例外情況或相依性。如需詳細資訊,請參閱語法和使用注意事項。
語法和使用注意事項
新增外鍵約束
當停用
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_NAME
和CONSTRAINT_TYPE
欄位來識別外鍵名稱。您也可以在單一陳述式中捨棄外鍵及其相關聯的索引
ALTER TABLE table DROP FOREIGN KEY constraint, DROP INDEX index;
如果被修改的表格中已存在外鍵 (也就是說,它是包含 FOREIGN KEY ... REFERENCE
子句的子表格),則線上 DDL 操作會受到其他限制,即使這些操作並未直接牽涉到外鍵欄位
如果父表格的變更透過使用
CASCADE
或SET NULL
參數的ON UPDATE
或ON DELETE
子句,而導致子表格中發生相關變更,則對子表格執行ALTER TABLE
可能會等待另一個交易認可。同樣地,如果表格是外鍵關係中的父表格,即使它不包含任何
FOREIGN KEY
子句,如果INSERT
、UPDATE
或DELETE
陳述式在子表格中導致ON UPDATE
或ON 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_PERSISTENT
、STATS_AUTO_RECALC
和STATS_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
演算法,但不允許使用ALGORITHM
和LOCK
語法。使用
FORCE
選項重建資料表ALTER TABLE tbl_name FORCE, ALGORITHM=INPLACE, LOCK=NONE;
自 MySQL 5.6.17 起使用
ALGORITHM=INPLACE
。ALGORITHM=INPLACE
不支援具有FULLTEXT
索引的資料表。執行「null」重建
ALTER TABLE tbl_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;
自 MySQL 5.6.17 起使用
ALGORITHM=INPLACE
。ALGORITHM=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 TABLESPACE tablespace_name RENAME TO new_tablespace_name;
ALTER TABLESPACE ... RENAME TO
使用INPLACE
演算法,但不支援ALGORITHM
子句。啟用或停用一般資料表空間加密
ALTER TABLESPACE tablespace_name ENCRYPTION='Y';
ALTER TABLESPACE ... ENCRYPTION
使用INPLACE
演算法,但不支援ALGORITHM
子句。如需相關資訊,請參閱第 17.13 節「InnoDB 靜態資料加密」。
啟用或停用每個資料表檔案資料表空間加密
ALTER TABLE tbl_name ENCRYPTION='Y', ALGORITHM=COPY;
如需相關資訊,請參閱第 17.13 節「InnoDB 靜態資料加密」。
除了某些 ALTER TABLE
分割區子句之外,分割的 InnoDB
資料表的線上 DDL 操作遵循與常規 InnoDB
資料表相同的規則。
某些 ALTER TABLE
分割區子句不會像常規的非分割 InnoDB
資料表一樣,通過相同的內部線上 DDL API。因此,ALTER TABLE
分割區子句的線上支援程度不一。
下表顯示每個 ALTER TABLE
分割區陳述式的線上狀態。無論使用哪個線上 DDL API,MySQL 都會盡可能減少資料複製和鎖定。
使用 ALGORITHM=COPY
或只允許「ALGORITHM=DEFAULT, LOCK=DEFAULT
」的 ALTER TABLE
分割區選項,會使用 COPY
演算法重新分割資料表。換句話說,會使用新的分割區方案建立新的分割資料表。新建立的資料表包含 ALTER TABLE
陳述式套用的任何變更,並將資料表資料複製到新的資料表結構中。
表 17.22:分割區操作的線上 DDL 支援
分割區子句 | 即時 | 就地 | 允許 DML | 注意事項 |
---|---|---|---|---|
PARTITION BY |
否 | 否 | 否 | 允許 ALGORITHM=COPY 、LOCK={DEFAULT|SHARED|EXCLUSIVE} |
ADD PARTITION |
否 | 是* | 是* | 對於 RANGE 和 LIST 分割區,支援 ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSISVE} ,對於 HASH 和 KEY 分割區,支援 ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSISVE} ,對於所有分割區類型,支援 ALGORITHM=COPY, LOCK={SHARED|EXCLUSIVE} 。不會複製以 RANGE 或 LIST 分割的資料表的現有資料。對於以 HASH 或 LIST 分割的資料表,允許使用 ALGORITHM=COPY 執行並行查詢,因為 MySQL 會在持有共用鎖定的同時複製資料。 |
DROP PARTITION |
否 | 是* | 是* |
支援
使用 |
DISCARD PARTITION |
否 | 否 | 否 | 僅允許 ALGORITHM=DEFAULT 、LOCK=DEFAULT |
IMPORT PARTITION |
否 | 否 | 否 | 僅允許 ALGORITHM=DEFAULT 、LOCK=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 |
否 | 否 | 否 | 會忽略 ALGORITHM 和 LOCK 子句。會重建整個資料表。請參閱第 26.3.4 節「維護分割區」。 |
REBUILD PARTITION |
否 | 是* | 否 | 支援 ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} 。 |
REPAIR PARTITION |
否 | 是 | 是 | |
REMOVE PARTITIONING |
否 | 否 | 否 | 允許 ALGORITHM=COPY 、LOCK={DEFAULT|SHARED|EXCLUSIVE} |
分割資料表上的非分割線上 ALTER TABLE
操作遵循與常規資料表相同的規則。但是,ALTER TABLE
會對每個資料表分割區執行線上操作,這會因對多個分割區執行操作而導致系統資源需求增加。
如需有關 ALTER TABLE
分割區子句的其他資訊,請參閱 分割區選項,以及第 15.1.9.1 節「ALTER TABLE 分割區操作」。如需一般分割區的資訊,請參閱 第 26 章分割區。