优化mySql以获得更快的alter table add列

我有一张有170,002,225行,大约35列和两个索引的表格。 我想添加一个列。 alter table命令花了大约10个小时。 在这段时间内,处理器看起来并不繁忙,也没有过多的IO等待。 这是一个4路高性能的箱子,有大量的内存。

这是我能做的最好的吗? 有什么我可以看看优化添加列调整数据库?

过去我也遇到过类似的情况,我以这种方式提高了操作的性能:

  1. 创build一个包含新列的新表(使用当前表的结构)。
  2. 执行INSERT INTO new_table (column1,..columnN) SELECT (column1,..columnN) FROM current_table;
  3. 重命名当前表
  4. 使用当前表的名称重命名新表。

MySQL中的ALTER TABLE实际上是要用新的模式创build一个新表,然后重新INSERT所有的数据并删除旧的表。 您可以通过创build新表格,加载数据然后重命名表格来节省一些时间。

从“高性能MySQL书”(percona guys):

加载MyISAM表的有效方法是禁用密钥,加载数据,肾是密钥:

 mysql> ALTER TABLE test.load_data DISABLE KEYS; -- load data mysql> ALTER TABLE test.load_data ENABLE KEYS; 

那么,我会build议使用最新的Percona MySQL构build,因为在MySQL手册中有以下说明

在其他情况下,即使不严格需要复制数据,MySQL也会创build一个临时表。 对于MyISAM表,可以通过将myisam_sort_buffer_size系统variables设置为较高值来加快索引重新创build操作(这是更改过程的最慢部分)。

您可以先执行ALTER TABLE DISABLE KEYS ,然后添加列,然后使用ALTER TABLE ENABLE KEYS 。 我没有看到在这里可以做任何事情。

顺便说一句,你不能去MongoDB? 添加列时不会重build任何内容。

也许你可以在更改表之前删除索引,因为大部分时间构build的索引是?