在MySQL生態中,修改欄位的類型需要使用COPY演算法對全表資料進行重建,且重建過程中目標表只能查詢資料,不能並發的寫入資料。更糟糕的是,COPY演算法採用單線程進行全表重建,其效率較低。因此,修改欄位類型操作一直是MySQL生態下的痛點問題。為瞭解決這一問題,PolarDB MySQL版支援秒級修改欄位(Instant Modify Column)功能,在修改欄位類型時,只需變更表定義資訊,無需修改已有資料,可以快速完成對任意大小表的欄位類型修改操作。本文介紹如何使用秒級修改欄位類型功能。
前提條件
PolarDB MySQL版8.0.2版本且修訂版本為8.0.2.2.28及以上,您可以通過查詢版本號碼來確認叢集版本。
參數說明
參數名 | 層級 | 說明 |
| Global | 秒級修改欄位功能控制開關。取值範圍如下:
|
| Global | 設定單表允許的秒級修改欄位最大次數。 取值範圍:1~64。 預設值為16。 |
PolarDB MySQL版秒級修改欄位功能目前處於灰階發布階段。如需使用請前往配額中心,根據配額ID
polarm_82_instant_modify_column找到配額名稱,在對應的操作列單擊申請來開通該功能。
使用限制
僅允許對以下資料類型進行長度擴充變更,不支援秒級修改除長度外的其他欄位屬性。具體支援的變更類型如下:
整數類型:支援在
TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT類型之間秒級修改,但僅支援秒級擴大長度,不支援秒級縮小長度。例如,
INT類型可以秒級修改為BIGINT類型,但無法將BIGINT類型秒級修改為INT類型。字串類型:
支援
VARCHAR(N)類型秒級修改為VARCHAR(N+M)類型,其中N和M均為大於0的正整數。例如,
VARCHAR(50)類型可以秒級修改為VARCHAR(300)類型,但不支援將VARCHAR(300)類型秒級修改為VARCHAR(50)類型。支援
CHAR(N)類型秒級修改為CHAR(N+M)類型,其中N和M均為大於0的正整數。例如,
CHAR(30)類型可以秒級修改為CHAR(50)類型,但不支援將CHAR(50)類型秒級修改為CHAR(30)類型。
僅支援行格式(Row Format)為
COMPACT和DYNAMIC的表。被修改的欄位不能是索引欄位。
不支援分區表進行秒級修改欄位操作。
不支援使用全文索引或空間索引的表。
不支援在同一條SQL中同時執行除秒級修改欄位以外的其他DDL操作。
您可以在執行DDL操作前使用EXPLAIN DDL功能,直觀地判斷當前DDL操作是否支援INSTANT操作。詳細內容請參見EXPLAIN DDL。
使用方法
指定ALGORITHM=INSTANT以強制使用秒級修改欄位功能(推薦)
CREATE TABLE t(a int);SHOW CREATE TABLE t;
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8-- 指定使用INSTANT演算法快速修改欄位類型
ALTER TABLE t modify COLUMN a bigint DEFAULT NULL,algorithm=INSTANT;使用上述語句時,若返回ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY/INPLACE.的錯誤,表示當前修改欄位類型操作無法使用Instant演算法執行。建議您查看loose_innodb_polar_instant_modify_column_enable參數是否已開啟,並仔細核對使用限制。
不指定ALGORITHM或指定ALGORITHM=DEFAULT,由PolarDB MySQL自行選擇最優執行方式
當不指定ALGORITHM或者指定為ALGORITHM=DEFAULT時,系統將按照如下優先順序選擇最優的演算法進行修改欄位類型操作。
ALTER TABLE test.test_table MODIFY COLUMN test_column bigint, ALGORITHM=DEFAULT;
ALTER TABLE test.test_table MODIFY COLUMN test_column bigint;PolarDB MySQL版資料庫在演算法選擇過程中遵循以下優先順序順序:
優先使用INSTANT演算法:INSTANT演算法執行DDL操作時,只需要修改資料字典中的中繼資料,不需要修改表中資料。因此,它不受表的大小影響,整個DDL過程可以秒級完成。
其次採用INPLACE演算法:大多數的INPLACE DDL在執行期間支援並發的讀寫操作,且支援使用並行DDL功能進行加速,對業務影響較小。
最後使用COPY演算法:COPY演算法需要重建整表資料,重建期間不允許執行並發寫入操作,對業務影響較大。
查看秒級修改的欄位資訊
在INFORMATION_SCHEMA資料庫中新增了INNODB_INSTANT_COLUMNS表。該表記錄了當前叢集中所有曾進行過秒級修改的欄位的資訊(只有經過秒級修改的欄位才會被收錄在此表中)。該表結構如下:
SHOW CREATE TABLE INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS;
***************************[ 1. row ]***************************
Table | INNODB_INSTANT_COLUMNS
Create Table | CREATE TEMPORARY TABLE `INNODB_INSTANT_COLUMNS` (
`TABLE_ID` bigint(21) unsigned NOT NULL DEFAULT '0',
`TABLE_NAME` varchar(193) NOT NULL DEFAULT '',
`SCHEMA_NAME` varchar(193) NOT NULL DEFAULT '',
`COLUMN_NAME` varchar(193) NOT NULL DEFAULT '',
`MTYPE` int(11) NOT NULL DEFAULT '0',
`PRTYPE` int(11) NOT NULL DEFAULT '0',
`LEN` int(11) NOT NULL DEFAULT '0',
`HAS_DEFAULT` int(1) NOT NULL DEFAULT '0',
`DEFAULT_VALUE` mediumblob,
`CURRENT_VERSION` int(11) NOT NULL DEFAULT '0',
`OLD_VERSION_INFO` blob
) ENGINE=InnoDB DEFAULT CHARSET=utf8欄位說明如下:
欄位名 | 描述 |
TABLE_ID | 表ID。 |
TABLE_NAME | 表名。 |
SCHEMA_NAME | 庫名。 |
COLUMN_NAME | 欄位名。 |
MTYPE | 欄位的類型資訊:MYSQL_TYPE_XXX。 |
PRTYPE | 欄位的PRTYPE資訊。 |
LEN | 欄位的長度資訊。 |
HAS_DEFAULT | 是否有預設值(秒級添加的欄位為 1,否則為 0)。 |
DEFAULT_VALUE | 預設值。 |
CURRENT_VERSION | 當前欄位的版本資訊。 |
OLD_VERSION_INFO | 該欄位上所有的歷史類型資訊。 |
藉助表INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS,您可以使用如下語句瞭解當前叢集已被秒級修改的欄位的情況:
SELECT * FROM INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS;如果目標表使用了Instant演算法進列欄位類型修改操作,而後又執行了需要重建表的DDL操作(如DROP COLUMN等),系統將會刪除INNODB_INSTANT_COLUMNS表中與該目標表相關的欄位資訊。