本章節中的以下主題提供了 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 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/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
演算法重建表格。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=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
演算法重建表格。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=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
欄位,則需要兩個長度位元組。因此,就地 (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_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
索引的表格。執行「空值」重建
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 章「分割區」。