一、背景
现实中各种情况会出现需要在大表中加字段或者索引。现象很慢,跑不动。
二、不停机解决方案
以下方案是带有自增id且不会修改数据表的方案
1、建立临时表
CREATE TABLE t_table_bak LIKE t_table;
2、加字段建索引
ALTER TABLE t_table_bak ADD COLUMN `name` VARCHAR(10) NOT NULL DEFAULT '' COMMENT '姓名';
ALTER TABLE t_table_bak ADD KEY `IDX_NAME` (`name`);
3、分段数据拷贝,如果加了字段,注意要把插入的字段给列出来
INSERT IGNORE INTO t_table_bak SELECT * FROM t_table WHERE id < 1000000 ;
INSERT IGNORE INTO t_table_bak SELECT * FROM t_table WHERE id >= 1000000 AND id < 2000000 ;
INSERT IGNORE INTO t_table_bak SELECT * FROM t_table WHERE id >= 2000000 AND id < 3000000 ;
...
...
4、并根据业务增长速度重置临时表最大id
SELECT MAX(id) FROM t_table_bak ; --记下此值供步骤6使用
ALTER TABLE t_table_bak AUTO_INCREMENT=#MAX(id)# + 预估增量;
5、rename表
RENAME TABLE t_table TO t_table_bak_bak;
RENAME TABLE t_table_bak TO t_table ;
6、补充数据, MAX(id)为步骤4的 MAX(id)
INSERT INTO t_table SELECT * FROM t_table_bak_bak WHERE id > MAX(id) ;
三、思考
如果表数据会有修改的可能性,应该怎么做。
1、表有修改时间字段。
2、迁移完数据后,根据修改时间字段查出t_table_bak_bak相关数据。
3、用id和更新时间作为相等条件进行数据更新(因有可能后续又被更新了)。
这种也只能适用于业务每次修改数据的字段是相同的。