【问题标题】:Avoiding InnoDB transaction overhead in table copy using INSERT ... SELECT使用 INSERT ... SELECT 避免表副本中的 InnoDB 事务开销
【发布时间】:2014-01-30 16:57:16
【问题描述】:
比起ALTER TABLE,我更喜欢创建一个新表,将数据复制到其中,然后移动以使用它。在 InnoDB 中这样做时,我总是很难执行:
INSERT INTO new_huge_tbl (SELECT * FROM old_huge_tbl)
由于事务的性质,如果我需要在任何时候停止此操作,至少可以说回滚并不容易。有什么方法可以在 InnoDB 中执行此操作而不是事务?
【问题讨论】:
标签:
mysql
sql
database
transactions
innodb
【解决方案1】:
不,不可能以简单的方式避免事务开销。您可能有两种选择:
- 在您自己的应用程序中,使用许多较小的事务(例如每个 10k 行)以小批量复制数据。
- 使用现有工具,使用相同的策略为您进行复制。我可以从 Percona 工具包中推荐
pt-archiver。
在内部,例如在做表格副本时ALTER TABLE,InnoDB 实际上就是这样做的,将副本分批成许多较小的事务。