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

And*_*rew 50 mysql performance alter

我有一个表有170,002,225行,约35列和两个索引.我想添加一个列.alter table命令大约需要10个小时.在那段时间内,处理器似乎都不忙,也没有过多的IO等待.这是一款带有大量内存的4路高性能盒子.

这是我能做的最好的吗?有什么我可以看一下在调整db时优化add列吗?

RRU*_*RUZ 38

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

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

  • 一些注意事项...... 1.`CREATE TABLE new_table LIKE表;```INSERT INTO new_table SELECT*FROM table;`3&4.如果将步骤3和4组合到此中,则可以获得伪原子重命名:`RENAME TABLE table = old_table,table = new_table;` (16认同)
  • 在复制它时(即重命名之前),如何处理旧表中发生的写入? (13认同)
  • 在这种情况下你如何处理FK(InnoDB)? (7认同)
  • 我们将我们的网站置于维护模式以进行这种繁重的操作.在迁移期间防止IO也将提高性能. (3认同)

小智 6

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

来自"高性能MySQL书"(percona人):

有效加载MyISAM表的常用技巧是禁用密钥,加载数据和插入密钥:

mysql> ALTER TABLE test.load_data DISABLE KEYS;
-- load data
mysql> ALTER TABLE test.load_data ENABLE KEYS;
Run Code Online (Sandbox Code Playgroud)


Gig*_*egs 3

也许您可以在更改表之前删除索引,因为构建索引需要花费大部分时间?

  • 这个答案是最正确的,在实践中,我已经在具有 >22.000.000 行的表上进行了测试。我所做的 - 删除所有索引(有 3 个),然后添加字段(在 HDD 上需要 4.23)并重新创建索引,每个索引花费不到 2 分钟。Darius Jahandarie - 不对,他不知道,在实践中他在说什么,RRUZ 的答案似乎也有效,但在实践中 - `INSERT INTO ... SELECT * FROM` 需要几个小时,其中删除索引添加列重新创建索引似乎是非常快的决定。PS 我宁愿先锁定这个表,以防止查询速度变慢。 (3认同)