mysql大表加字段建索引方案小记

一、背景
现实中各种情况会出现需要在大表中加字段或者索引。现象很慢,跑不动。

二、不停机解决方案
以下方案是带有自增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和更新时间作为相等条件进行数据更新(因有可能后续又被更新了)。

这种也只能适用于业务每次修改数据的字段是相同的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值