优化mySql以获得更快的alter table add列
我有一张有170,002,225行,大约35列和两个索引的表格。 我想添加一个列。 alter table命令花了大约10个小时。 在这段时间内,处理器看起来并不繁忙,也没有过多的IO等待。 这是一个4路高性能的箱子,有大量的内存。
这是我能做的最好的吗? 有什么我可以看看优化添加列调整数据库?
过去我也遇到过类似的情况,我以这种方式提高了操作的性能:
- 创build一个包含新列的新表(使用当前表的结构)。
- 执行
INSERT INTO new_table (column1,..columnN) SELECT (column1,..columnN) FROM current_table;
- 重命名当前表
- 使用当前表的名称重命名新表。
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的索引是?