【发布时间】:2017-06-22 11:17:11
【问题描述】:
我想将 200 万行表的引擎从 MyISAM 更改为 InnoDB。我害怕这种长时间的操作,所以我创建了类似结构的 InnoDB 表,现在我想将所有数据从旧表复制到这个新表。最快的方法是什么?选择插入?那么开始交易呢?请帮忙。我不想挂起我的服务器。
【问题讨论】:
-
安排停机时间。
我想将 200 万行表的引擎从 MyISAM 更改为 InnoDB。我害怕这种长时间的操作,所以我创建了类似结构的 InnoDB 表,现在我想将所有数据从旧表复制到这个新表。最快的方法是什么?选择插入?那么开始交易呢?请帮忙。我不想挂起我的服务器。
【问题讨论】:
帮自己一个忙:将整个设置复制到您的本地机器上,然后在那里尝试一切。你会更好地了解你正在做什么。请注意生产服务器和本地计算机之间的潜在硬件差异。
最快的方式可能是最直接的方式:
INSERT INTO table2 SELECT * FROM table1;
【讨论】:
我怀疑你不能比 ALTER 内置的更快。它确实必须复制所有数据并重建所有索引。
一定要提出innodb_buffer_pool_size 为 InnoDB 做准备。并降低key_buffer_size 以留出空间。建议分别使用 35% 和 12% 的 RAM 用于过渡。转换所有表后,建议 70% 和仅 20MB。
一个轻微的加速是做一些选择来获取整个表和整个PRIMARY KEY(如果它可以被缓存的话)。这将在真正开始之前执行一些 I/O。示例:SELECT avg(id) FROM tbl 其中 id 是主键。还有SELECT avg(foo) FROM tbl,其中 foo 没有被索引,但它是数字的。这些将强制对 PK 索引和数据进行全面扫描,从而缓存 ALTER 必须读取的内容。
【讨论】: