MySQL DBA應該都知道,數據庫操做裏面,DDL操做(好比CREATE,DROP,ALTER等)代價是很是高的,特別是在單表上千萬的狀況下,加個索引或改個列類型,就有可能堵塞整個表的讀寫。mysql
從MySQL 5.6開始,你們期待的Online DDL出現了,能夠實現修改表結構的同時,依然容許DML操做(select,insert,update,delete)。但改變字段類型,好比從CHAR變爲VARCHAR;修改字段類型,好比增長VARCHAR大小,這些在MySQL 5.7以前仍是會鎖表的。從MySQL 5.7開始就支持了對於tinyint、int、smallint、bigint等數值類型的數據類型,自身位大小的增大或減少是支持ONLINE的(注意:不支持從tinyint變動爲int)。還支持了VARCHAR類型的在線增大,但也有些限制。sql
支持了對於tinyint、int、smallint、bigint等數值類型的數據類型,自身位大小的增大或減少是支持ONLINE的(注意:不支持從tinyint變動爲int),以下:數據庫
mysql> alter table t1 change id id bigint(10),ALGORITHM=INPLACE,LOCK=NONE;ui
Query OK, 0 rows affected (0.01 sec)this
Records: 0 Duplicates: 0 Warnings: 0索引
mysql> alter table t1 change id id bigint(30),ALGORITHM=INPLACE,LOCK=NONE;table
Query OK, 0 rows affected (0.01 sec)test
Records: 0 Duplicates: 0 Warnings: 0require
另外,若是是更改字段屬性(類型不變)根據類型不一樣支持的Online DDL也是有限的,如把容許爲NULL變動爲不容許爲NULL就不支持。date
mysql> alter table sbtest change column dd dd varchar(100) not null,ALGORITHM=INPLACE,LOCK=NONE;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: cannot silently convert NULL values, as required in this SQL_MODE. Try ALGORITHM=COPY;
可是在線支持變動comment屬性。
mysql> alter table info change dd dd varchar(100) null comment "test",ALGORITHM=INPLACE,LOCK=NONE;
須要注意的是,在MySQL 5.6以前使用ALTER TABLE … ALGORITHM=INPLACE的表不支持包含時間列(DATE,DATETIME,TIMESTAMP),否則會報錯。
MySQL 5.7版本支持重命名索引和修改varchar的大小(增大不能減少),且無需table-copy(秒級增長varchar大小)。這兩項操做在以前的版本中,都須要重建索引或表,適用於各引擎。