left join30万行数据的问题

PIGer920 2013-04-01 12:13:31
有一张表(innodb)有30万行数据,现在需要对表增加几个字段,但是因为数据量大,直接修改表结构会导致锁表。影响服务。服务不能停。

所以目前考虑是另做一个新表(老表+新增的字段),然后程序上对新老两表同时做写操作,读仍然是读老表数据(因为老表数据是100%完整)。
然后将老表数据和新表数据的差分copy到新表后(新表数据就完整了),读写就都改到新表。老表即可作废。(实际上差分找出后,还得去查另一个表找到相应数据再插入到新表中。)

现在问题是在做新老两表差分时我用的是left join。差分数据应该有30万条。这样会不会消耗太多内存? 以及整个流程有没有更好的解决方案?
...全文
352 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
rucypli 2013-04-01
  • 打赏
  • 举报
回复
lz的方法逻辑太麻烦 而且并不保险 在低峰时段锁定30万数据也就锁定几秒钟而已,一般的业务我觉的都可以接受的 如果非要在线更改,就用perconal的pt-online-schema-change http://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html
PIGer920 2013-04-01
  • 打赏
  • 举报
回复
引用 1 楼 WWWWA 的回复:
肯定有影响,建议直接修改老表,在使用较少的时候
修改老表估计会造成几秒的锁定状态 无法直接修改老表。 还有一些比较好的copy数据但又不影响服务的方法吗
Rotel-刘志东 2013-04-01
  • 打赏
  • 举报
回复
最好在也夜间操作少的情况下,重建一个新表,对修改老表数据,然后删除老表数据,新表重命名就可以。 在生产环境下操作最好先lock table 表名,否则会涉及到数据完整性的问题。
WWWWA 2013-04-01
  • 打赏
  • 举报
回复
肯定有影响,建议直接修改老表,在使用较少的时候
ACMAIN_CHM 2013-04-01
  • 打赏
  • 举报
回复
引用 4 楼 PIGer920 的回复:
引用 3 楼 rucypli 的回复:lz的方法逻辑太麻烦 而且并不保险 在低峰时段锁定30万数据也就锁定几秒钟而已,一般的业务我觉的都可以接受的 如果非要在线更改,就用perconal的pt-online-schema-change http://www.percona.com/doc/percona-toolkit/2.2/pt-online-sc……
生产环境下会有锁的问题,另外生产环境中的表中记录数也会影响。 alter table实质就是复制一个表,然后删除老表,再重命名新表为老表名。
PIGer920 2013-04-01
  • 打赏
  • 举报
回复
引用 3 楼 rucypli 的回复:
lz的方法逻辑太麻烦 而且并不保险 在低峰时段锁定30万数据也就锁定几秒钟而已,一般的业务我觉的都可以接受的 如果非要在线更改,就用perconal的pt-online-schema-change http://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html ……
开发环境上册了一下修改表结构需要2.09 sec 增加相应的索引(1个)需1.20 sec 生产环境上涉及到主从复制,这个时间会被放大化吗?这个库里含有的一些表是比较重要的,比如用户信息等。

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧