2012-06-12 114 views
8

我想在我的表运行此:更改HUGE表中列的数据类型。性能问题

ALTER TABLE table_name MODIFY col_name VARCHAR(255) 

但我的表是巨大的,它比65M以上(65亿美元)的行。现在当我执行的时候,执行这个命令需要将近50分钟。任何更好的方式来改变表?

+4

不,这将是缓慢的。 ALTER语句是一次性操作。等一下,希望你不需要再做一次。 –

+3

巨大的桌子?没有。很大?是。 –

回答

3

那么,你需要

ALTER TABLE table_name CHANGE col_name new_name VARCHAR(255) 

但是,你是正确的,这需要一段时间来进行更改。真的没有更快的方式来改变MySQL中的表格。

在变更过程中,您担心停机吗?如果是这样,这里有一种可能的方法:将表格复制到新的表格中,然后更改副本上的列名称,然后重命名该副本。

您可能已经想通过在生产系统中常规更改表中的列名不是一个好主意。

+0

是的。我不能承受50分钟的停机时间,因为在此期间所有的行都会被锁定,这将阻止此表上的其他操作(CRUD)。 – Kiran

+0

呃。哦。这意味着,如果您复制表格,则在重新组织新表格时,新表格和更改行将出现在旧表格中。如果这是我的项目,我现在要试着决定改变这个列名的重要性。 –

+0

是的。我可以做一件事。宣布1小时的停机时间,并在负载较少时进行更改。可能在午夜。不过,谢谢你的投入。 – Kiran

0

您可以使用Oak处理模式更改而无需停机。

oak-online-alter-table复制原始表的模式,应用您的更改并复制数据。 CRUD操作仍然可以被调用,因为橡木会在原始表格上放置一些触发器,因此在操作过程中不会丢失任何数据。

请参考other question橡木的作者给出了关于这种机制的详细解释,并且还提出了其他工具。