使用INSERT ... SELECT避免表复制中的InnoDB事务开销

时间:2014-01-30 16:57:16

标签: mysql sql database transactions innodb

而不是做ALTER TABLE我更喜欢创建一个新表,将数据复制到它,然后移动使用它。在InnoDB中这样做时,我总是很难表现:

INSERT INTO new_huge_tbl (SELECT * FROM old_huge_tbl) 

由于交易的性质,如果我在任何时候需要停止此操作,至少可以说回滚并不容易。有没有什么办法可以在InnoDB中执行此操作而不是它的交易?

1 个答案:

答案 0 :(得分:0)

不,以简单的方式避免交易开销是不可能的。您可能有两种选择:

  1. 在您自己的应用程序中,使用许多较小的事务(例如每个10k行)以小批量复制数据。
  2. 使用现有工具,使用相同的策略为您执行复制。我可以从Percona工具包中建议pt-archiver
  3. 在内部,为表格复制时,例如ALTER TABLE,InnoDB确实做到了这一点,将副本批量处理为许多较小的事务。