向大型MYSQL数据库添加新字段


Adding new fields to large MYSQL database

我帮助运营一个相当大的电子商务网站,因为我们遇到了由于数据大小而向InnoDB表添加字段的问题。

它甚至没有"那么"大…大约385,000行,500mb的大小——但是现在当我们添加一个新字段时,整个表就会锁定,我让它尽可能长时间地运行,但是一旦它被锁定,它就会在实时站点上阻塞查询。它还会在其他查询上导致"元数据锁定"。

它运行在一个体面的服务器上,主机说它只是"那些事情中的一件",因为它做了(MYSQL)设计做的事情。

所以我的想法是在几个小时之外创建一个包含字段更改的新表,然后将数据导入,但我对它作为解决方案并不满意,因为这意味着如果需要,我们无法在白天进行任何紧急开发工作。

有没有人有关于如何解决这个问题的想法?

谢谢。编辑:

感谢大家到目前为止的回答,来回答一些问题;

1)"在现场进行开发工作?"-我们有一个开发环境,但迟早你需要把这些变化!这就是我的意思。

2)"复制MYSQL的工作?"-从谷歌上的其他搜索中,有人建议一个好的解决方案是创建一个空表,对您需要的字段进行更改,然后重新导入旧数据(然后删除旧表)。不确定这是否比仅仅让MYSQL通过创建tmp表更快/更好?

3) @ ueerdo -这是一个非常基本的设置,InnoDB表与键。它是保存所有已完成的客户购物车详细信息的表(我们有一个浮动表用于处理正在进行的订单),并且可以不断访问(添加新记录,客户服务检查订单,客户检查跟踪等)。我需要在这个表中添加4-5个新字段,当我提交'ALTER'时,它只是锁住表,因此开始排队上面提到的需要这些数据的查询。

在开始修改大表之前,你需要将网站切换到维护模式。在执行alter时,需要关闭所有可以查询数据库的程序。

是的,服务关闭是令人难过的,但这是最好的方法,只要你有一个DB服务器。

关于自己创建单独的表和迁移数据-我不知道你的详细信息,但看起来你正在做的事情是MySQL内部自己做的,所以通常不需要自己做这些事情。

同样,在启动ALTER执行后,您可以打开另一个MySQL连接并运行SHOW FULL PROCESSLIST来查看您的查询执行情况。