ALGORITHM=INPLACE,可以避免重建表带来的IO和CPU消耗,保证ddl期间依然有良好的性能和并发。
ALGORITHM=COPY,需要拷贝原始表,所以不允许并发DML写操作,可读。这种copy方式的效率还是不如 inplace ,因为前者需要记录undo和redo log,而且因为临时占用buffer pool引起短时间内性能受影响。
1、在线添加索引:
alter table test_emp add index idx_id (c1),ALGORITHM=INPLACE;
2、在线添加字段:
alter table test_emp add name varchar(100) not null default '',ALGORITHM=INPLACE;
3、在线修改字段属性:
alter table test_emp ALGORITHM=INPLACE,modify c6 varchar(85) not null default '';
1.PRIMARY KEY(主键索引)
mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) ,ALGORITHM=INPLACE;
2.UNIQUE(唯一索引)
mysql>ALTER TABLE `table_name` ADD UNIQUE (`column` ) ,ALGORITHM=INPLACE;
3.INDEX(普通索引)
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` ),ALGORITHM=INPLACE;
4.FULLTEXT(全文索引)
mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column` ),ALGORITHM=INPLACE;
5.多列索引
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` ),ALGORITHM=INPLACE;
注意
添加字段alter table时,对该表的增删改查均不会锁表。而在这之前,当该表被访问时,需要等其执行完毕后才可以执行alter table。
如果字段属性大于并等于varchar(256)(这里的256是指字节(UTF8占用3字节)或者把varchar(80)减少到varchar(70)或者更少),则仍需要拷贝数据且锁全表。
只变更int的位数,是可以的,不过这没什么意义,因为无论你int多少,最多都只能存10位,这也就是为什么我们生产库开发规范要定义所有的int都用int(10)。
总结
删除主键锁全表
增加,删除字段或索引不锁全表
针对varchar属性的字段只能扩不能减
不支持int属性
来源:oschina
链接:https://my.oschina.net/u/4023534/blog/3185312