假设一张表已经有5000w数据了,现在想加一个字段,加字段特别慢,
并且加字段的同时要停服务,想问下行业上的解决方案是什么,主要还是
加字段速度特别慢的问题,如果能解决不停止服务加字段那就更好了,
希望有人能解决!,谢谢。
导出来重命名加好了,吧新的数据放进去,在替换表名,但还是要停一下服务保证新产生数据不丢失
正确的做法是这样,对于数据量很大的表,需要添加所有或者修改字段的做法是如下:
create table new_tb like tb_old;
alter table new_tb add COLUMN new_column varchar(32) DEFAULT null;
insert into new_tb (字段) select 字段 from tb_old;
这里需要注意下,你的额insert字段和你查询出来的字段一直,对应顺序也是需要需要一致的,如果你只是修改字段的属性,或者添加了索引之类的,字段数量没用变话,那么直接这样写
insert into new_tb select * from tb_old;
drop table tb_old;
alter table new_tb rename to tb_old;
如果含有外键约束的换,那么还需要处理下外键。
这几部下来就可以防止修改大量数据表而带来的表锁死情况了。
-- 创建新表(默认数据的话直接使用,自定义字段类型可以通过新建一个表保存一条旧表的主键ID和你要创建的字段,通过旧表主键关联实现)
create table tb1 as
select t.*, '' as col_new from tb;
-- 删除旧表
drop table tb;
-- 修改表明
ALTER TABLE tb1 RENAME TO tb;
先加字段,然后升级项目功能,这样不用停服务啊
使用外键再建一张表,这样就可以不用停服务加字段了。
1.升级mysql5.7 在线ddl 可以了解下 https://blog.csdn.net/carry9148/article/details/52640440
2.5000万的表本身已经不正常了,如果是一个在线提供服务给用户的表,不会允许5000万的。一般6-8百万。这时候会进行分表。
3.分表后还有600-800 增加一个字段还需要1分钟,那么选择使用此表人数最少的时候,写一个自动执行脚本。类似凌晨3点。
4.加字段并不需要停止服务。