MySQL:在表之间执行大数据迁移

Mic*_*art 7 mysql innodb migration

我想在 2 个 InnoDB 表之间迁移数据。

目前我正在运行这个查询:

INSERT INTO table_a SELECT * FROM table_b;
Run Code Online (Sandbox Code Playgroud)

如果数据集增长,避免 CPU 过载的最佳方法是什么?

谢谢

Rol*_*DBA 2

由于您使用的是 InnoDB 我想建议以下内容:

建议#1

如果执行 INSERT、UPDATE 和 DELETE,请像这样批量加载表:

CREATE TABLE table_new LIKE table_a;
INSERT INTO table_new SELECT * FROM table_b;
ALTER TABLE table_a RENAME table_old;
ALTER TABLE table_new RENAME table_a;
DROP TABLE table_old;
Run Code Online (Sandbox Code Playgroud)

如果除了 INSERT 和 SELECT 之外不执行任何操作,请将新条目加载到表中。table_a假设和的主键table_bid,按如下方式执行加载:

CREATE TABLE table_new LIKE table_a;
INSERT INTO table_new SELECT B.* FROM table_b B
LEFT JOIN table_a A USING (id) WHERE A.id IS NULL;
INSERT INTO table_a SELECT * FROM table_new;
DROP TABLE table_new;
Run Code Online (Sandbox Code Playgroud)

建议#2:针对多个 CPU 调整 InnoDB

确保您使用的是 MySQL 5.5。如果您有 MySQL 5.1.38 或更高版本,则必须安装 InnoDB 插件。如果您有 MySQL 5.1.37 或更低版本,只需升级到 MySQL。

完成此操作后(或者如果您已经拥有 MySQL 5.5),您必须针对多个 CPU 调整 InnoDB。这里不是重新发明轮子,而是我过去关于如何以及为什么这样做的帖子:

试一试 !!!

我可以建议其他东西,例如缓冲区、日志文件等等。我只解决了这两个问题。