使用傳統方法執行加列操作時,需要重建整個表資料,佔用大量系統資源。PolarDB MySQL版支援秒級加欄位(Instant add column
)功能,在加列操作時只需變更表定義資訊,無需修改已有資料,協助您快速完成對任意大小表的加列操作。本文介紹如何使用秒級加欄位功能。
前提條件
叢集版本需為以下版本之一:
PolarDB MySQL版5.6版本且修訂版本為5.6.1.0.43或以上,您可以通過查詢版本號碼確認叢集的修訂版本。
說明PolarDB MySQL版5.6版本的秒級加列功能目前處於灰階階段,如需使用,請前往配額中心,根據配額ID
polardb_mysql_iac_56
找到配額名稱,在對應的操作列單擊申請來開通該功能。PolarDB MySQL版5.7版本且修訂版本為5.7.1.0.6或以上,您可以通過查詢版本號碼確認叢集的修訂版本。
說明您需要先配置loose_innodb_support_instant_add_column參數才能在PolarDB MySQL版5.7版本的叢集上使用該功能。
PolarDB MySQL版8.0版本。
說明PolarDB MySQL版8.0版本的叢集預設支援秒級加欄位功能,無需配置任何參數。
使用限制
新增列只能為表的最後一列。
不支援添加虛擬列(PolarDB MySQL版8.0版本支援)。
不支援在分區表上添加列(PolarDB MySQL版8.0版本支援)。
不支援使用了全文索引或列存索引的表。
不支援開啟了
Implicit primary key
選項且未自訂主鍵的表。不支援在同一條SQL中同時執行其它DDL操作和
Instant add column
操作。
使用方法
參數設定
針對PolarDB MySQL版5.6版本和PolarDB MySQL版5.7版本的叢集,您需要開啟loose_innodb_support_instant_add_column參數來使用秒級加欄位功能。如何設定參數值請參見設定叢集參數和節點參數。
說明PolarDB MySQL版8.0版本的叢集無需配置該參數即可直接使用秒級加欄位功能。
參數
層級
說明
loose_innodb_support_instant_add_column
Global
秒級加欄位功能的開關,取值範圍如下:
ON:開啟秒級加欄位功能。
OFF(預設):關閉秒級加欄位功能。
語句
指定
ALGORITHM=INSTANT
以強制使用秒級加欄位功能,語句樣本如下:ALTER TABLE test.t ADD COLUMN test_column int, ALGORITHM=INSTANT;
使用上述語句時,若返回
ERROR 0A000: ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE.
的錯誤,表示當前加列操作不能以Instant演算法執行,建議您查看loose_innodb_support_instant_add_column參數是否已開啟,並仔細核對使用限制。不指定
ALGORITHM
或指定ALGORITHM=DEFAULT
,PolarDB會自行選擇執行速度最快的演算法來執行加列操作,語句樣本如下:ALTER TABLE test.t ADD COLUMN test_column int, ALGORITHM=DEFAULT; ALTER TABLE test.t ADD COLUMN test_column int;
說明PolarDB演算法選擇的優先順序為INSTANT > INPLACE > COPY。
查看通過Instant演算法增加的列資訊
對於PolarDB MySQL版5.6版本和PolarDB MySQL版5.7版本,
INFORMATION_SCHEMA
資料庫中新增了INNODB_SYS_INSTANT_COLUMNS
表。該表記錄了使用Instant演算法增加的列資訊,例如列名、列序號和預設值(二進位方式儲存)等。您可通過如下語句查看該表詳情來確認新增的列資訊。SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_INSTANT_COLUMNS;
說明對目標表使用了Instant演算法增加列後,如果執行了需要重建表的DDL操作(如DROP COLUMN),系統將會刪除
INNODB_SYS_INSTANT_COLUMNS
表中目標表的相關列資訊。對於PolarDB MySQL版8.0版本,您可通過如下語句查看錶的列資訊,若查詢結果中
has_default
列為1,則說明該列是通過Instant演算法增加的。SELECT * FROM INFORMATION_SCHEMA.INNODB_COLUMNS WHERE TABLE_ID = (SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME = "test/t1");
聯絡我們
若您對DDL操作有任何疑問,請聯絡我們。