【问题标题】: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】:

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

    1. 在您自己的应用程序中,使用许多较小的事务(例如每个 10k 行)以小批量复制数据。
    2. 使用现有工具,使用相同的策略为您进行复制。我可以从 Percona 工具包中推荐 pt-archiver。

    在内部,例如在做表格副本时ALTER TABLE,InnoDB 实际上就是这样做的,将副本分批成许多较小的事务。

    【讨论】:

      猜你喜欢
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 2018-07-05
      • 2011-10-15
      相关资源
      最近更新 更多