StackTc
StackTc
采纳率61.9%
2018-12-20 17:28 阅读 3.8k

mysql 一张超级大表,加字段很慢怎么办

20

假设一张表已经有5000w数据了,现在想加一个字段,加字段特别慢,
并且加字段的同时要停服务,想问下行业上的解决方案是什么,主要还是
加字段速度特别慢的问题,如果能解决不停止服务加字段那就更好了,

希望有人能解决!,谢谢。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

6条回答 默认 最新

  • qq_35235940 听楼一夜雨 2018-12-20 09:56

    导出来重命名加好了,吧新的数据放进去,在替换表名,但还是要停一下服务保证新产生数据不丢失

    点赞 评论 复制链接分享
  • it_zhangwei 路漫漫兮其修远兮 2018-12-21 01:59

    正确的做法是这样,对于数据量很大的表,需要添加所有或者修改字段的做法是如下:

    • 1.先创建一张一样的表
        create table new_tb like tb_old;
    
    • 2.修改创建表的字段
        alter table new_tb add COLUMN new_column varchar(32) DEFAULT null;
    
    • 3.原始数据插入到新的数据表中
        insert into new_tb (字段)  select 字段 from tb_old;
    

    这里需要注意下,你的额insert字段和你查询出来的字段一直,对应顺序也是需要需要一致的,如果你只是修改字段的属性,或者添加了索引之类的,字段数量没用变话,那么直接这样写

        insert into new_tb   select * from tb_old;
    
    • 4.删除原来的数据表,并且重新命名新的数据表:
        drop table tb_old;
        alter table new_tb rename to tb_old;
    
    

    如果含有外键约束的换,那么还需要处理下外键。

    这几部下来就可以防止修改大量数据表而带来的表锁死情况了。

    点赞 评论 复制链接分享
  • u011909918 有人把我昵称抢了 2018-12-21 02:14

    -- 创建新表(默认数据的话直接使用,自定义字段类型可以通过新建一个表保存一条旧表的主键ID和你要创建的字段,通过旧表主键关联实现)
    create table tb1 as
    select t.*, '' as col_new from tb;

    -- 删除旧表
    drop table tb;

    -- 修改表明
    ALTER TABLE tb1 RENAME TO tb;

    点赞 评论 复制链接分享
  • zhongsan123 才沐木 2018-12-21 02:51

    先加字段,然后升级项目功能,这样不用停服务啊

    点赞 评论 复制链接分享
  • ainiburuqusi ainiburuqusi 2018-12-20 09:54

    使用外键再建一张表,这样就可以不用停服务加字段了。

    点赞 评论 复制链接分享
  • skyboertao 风姿-懒人 2018-12-20 11:17

    1.升级mysql5.7 在线ddl 可以了解下 https://blog.csdn.net/carry9148/article/details/52640440
    2.5000万的表本身已经不正常了,如果是一个在线提供服务给用户的表,不会允许5000万的。一般6-8百万。这时候会进行分表。
    3.分表后还有600-800 增加一个字段还需要1分钟,那么选择使用此表人数最少的时候,写一个自动执行脚本。类似凌晨3点。
    4.加字段并不需要停止服务。

    点赞 评论 复制链接分享

相关推荐