RDS MySQL的秒級加列功能通過變更中繼資料實現快速加列操作,避免全表資料重建,可在秒級內完成,且與表資料量大小無關。秒級加列幾乎不消耗額外系統資源,也不會對業務造成鎖表或阻塞的影響,適用於需要頻繁擴充表結構且對商務持續性要求較高的情境。
功能說明
RDS MySQL的秒級加列(Instant Add Column)通過變更資料字典的中繼資料來最佳化ADD COLUMN 操作。該功能避免了傳統DDL操作對全表資料的修改或重建,實現加列操作在秒級內完成,且不受表資料量影響。
秒級加列與傳統加列的核心優勢對比:
對比項 | 傳統加列(Copy或Inplace模式) | RDS秒級加列(Instant模式) |
加列耗時 | 需要全表資料重建,耗時與表大小成正比。 | 僅修改中繼資料,操作時間長度可控制在秒級。 |
資源消耗 | 臨時佔用大量系統資源(如IO、記憶體)。 | 幾乎不消耗額外資源。 |
業務影響 | 長事務或高並發情境可能阻塞線上業務。 | 無鎖表或阻塞影響。 |
表大小限制 | 無法支援大錶快速加列。 | 支援任意大小錶快速加列。 |
適用範圍
如需使用秒級加列功能,執行個體版本要求如下,當小版本不符合要求時,可以升級核心小版本:
MySQL 8.0:所有核心小版本均支援。
MySQL 5.7:核心小版本大於等於20250331。
使用秒級加列功能時有以下限制:
引擎節流:僅支援InnoDB引擎。
表類型限制:不支援壓縮表、帶全文索引的表和暫存資料表。
操作限制:不支援多操作合并,例如在添加列的同時添加索引。
唯讀執行個體限制:掛載了唯讀執行個體的高可用主執行個體使用秒級加列功能時,需要在主執行個體和唯讀執行個體上均設定loose_innodb_instant_ddl_enabled參數為ON,否則會導致唯讀執行個體複製中斷。
預設加列位置:
MySQL版本
核心小版本
加列位置
5.7
大於等於20250331
預設最後一列。
8.0
低於20230630
預設最後一列。
大於等於20230630
支援在新增列時指定列位置。
MySQL 5.7或MySQL 8.0(低於20230630版本)執行個體使用秒級加列時,需要保證資料表中不存在隱式主鍵。
開啟秒級加列
MySQL 8.0預設開啟秒級加列,您無需修改參數即可使用該功能。MySQL 5.7需參考以下步驟開啟秒級加列:
訪問RDS執行個體列表,選擇地區並單擊目標執行個體ID。
在左側導覽列,單擊參數設定。
在可修改參數頁簽中搜尋
loose_innodb_instant_ddl_enabled參數,並在該參數的運行參數值列,修改參數值為ON。說明修改
loose_innodb_instant_ddl_enabled參數可以立即生效且無需重啟執行個體。單擊提交參數,在彈出的對話方塊中,選擇生效的時間段,完成後單擊確定。
相關操作
使用秒級加列
指定
ALGORITHM=INSTANT強制使用秒級加列:ALTER TABLE <table_name> ADD COLUMN <column_name> <data_type> <constraints>, ALGORITHM = INSTANT;不指定
ALGORITHM,RDS MySQL運行時根據條件選擇最優模式:ALTER TABLE <table_name> ADD COLUMN <column_name> <data_type> <constraints>;
查看已執行秒級加列的表
MySQL 5.7:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE INSTANT_COLS > 0;MySQL 8.0:
-- 核心小版本低於20230630 SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE INSTANT_COLS > 0; -- 核心小版本大於等於20230630 SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE TOTAL_ROW_VERSIONS > 0;
查看通過秒級加列添加的列
MySQL 5.7:
5.7版本在
INFORMATION_SCHEMA庫中新增了INNODB_SYS_INSTANT_COLUMNS表,通過如下SQL查看秒級加列功能添加的列資訊。SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_INSTANT_COLUMNS WHERE TABLE_ID = (SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME = "<database_name>/<table_name>");MySQL 8.0:
通過如下SQL查看錶的列資訊,若查詢結果中
HAS_DEFAULT列為1,則說明該列是通過秒級加列功能添加的。SELECT * FROM INFORMATION_SCHEMA.INNODB_COLUMNS WHERE TABLE_ID = (SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME = "<database_name>/<table_name>");
常見問題
Q1:執行個體滿足秒級加列適用範圍,但添加列時依然報錯:Feature not supported: 1845 ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE
A:
原因:如果表上沒有主鍵或唯一鍵,為保證複製效率,RDS MySQL預設會給表加一個隱式主鍵,隱式主鍵預設是表的最後一列,所以這會導致Instant加列語句變成指定位置加列(要保證隱式主鍵是最後一列),但是 MySQL 5.7或MySQL 8.0(低於20230630版本)執行個體不支援指定位置加列,所以產生該報錯。
解決方案:MySQL 5.7或MySQL 8.0(低於20230630版本)執行個體使用秒級加列時,需要保證資料表中不存在隱式主鍵。