你需要更仔细地考虑你的要求。
在最简单的层面,获得表更改的“最快”方法是尽可能少地使用ALTER TABLE语句,最好是一个。这是因为MySQL复制表的数据以更改模式并做出15次更改,而单个副本显然(并且实际上)比将表复制十五次更快,从而一次更改一次。
但我怀疑你要问如何做这种变化与最少的停机时间。我将这样做,你基本上合成的方式非块ALTER TABLE将工作。但它有一些额外的要求:
>您需要一种方法来跟踪添加和更改的数据,例如后者的“修改”日期字段,或前者的AUTO_INCREMENT字段。
>您需要空间在数据库上具有两个表的副本。
>您需要一个时间段,其中对表的更改不会超过快照
基本的技术是你建议的,即使用INSERT INTO … SELECT ….至少你在前面,因为你从一个InnoDB表开始,所以SELECT不会阻塞。我建议对新的空表执行ALTER TABLE,这将保存MySQL复制所有数据,这意味着您需要在INSERT INTO … SELECT …语句中正确列出所有字段。然后你可以做一个简单的RENAME语句来交换它。然后你需要做另一个INSERT INTO … SELECT … WHERE …也许一个UPDATE … INNER JOIN … WHERE …来获取所有修改的数据。您需要快速执行INSERT和UPDATE,否则代码将开始向快照添加新行和更新,这会干扰您的更新。 (如果你可以将你的应用程序进入维护模式几分钟从RENAME之前,你不会有这个问题。)
除此之外,还有一些关键和缓冲区相关的设置,你可以更改只是一个会话,可以帮助主要数据移动。像read_rnd_buffer_size和read_buffer_size这样的函数会增加。