将带有重复项的大表插入到具有mysql唯一键的新表中

时间:2017-06-22 08:55:38

标签: mysql database

我有一个包含大约250万行的表,Table1,它有重复项。 我创建了一个新表Table2,它具有相同的列名,但是我想要的列具有唯一索引。

我想将Table1中的数据插入到Table2中,在路上删除重复项。我使用这个查询:

INSERT IGNORE INTO Table2 SELECT * FROM TABLE1;

问题是,半小时的运行时间不足以让这个过程完成。有关如何实现这一点的任何建议?是否有一种简单的方法可以按块传输数据,即使表1中的索引没有线性排序?

1 个答案:

答案 0 :(得分:1)

尝试使用1000行的负载插入几次,第一个查询将让您知道需要多长时间,但每个查询花费的时间可能会增加

INSERT IGNORE INTO Table2 SELECT * FROM TABLE1 limit 1000;
INSERT IGNORE INTO Table2 SELECT * FROM TABLE1 limit 1000;
INSERT IGNORE INTO Table2 SELECT * FROM TABLE1 limit 1000;
[...]

如果第二个查询没有插入任何内容(不确定是否在限制之前或之后应用了忽略语句),则必须使用偏移量:

INSERT IGNORE INTO Table2 SELECT * FROM TABLE1 limit 1000;
INSERT IGNORE INTO Table2 SELECT * FROM TABLE1 limit 1000 offset 1000;
INSERT IGNORE INTO Table2 SELECT * FROM TABLE1 limit 1000 offset 2000;
[...]

如果它仍然太慢,您可以尝试添加外部联接以避免尝试插入已插入的数据,但可能需要将两个表都编入索引(不需要主索引)。

INSERT IGNORE INTO Table2 SELECT TABLE1.* FROM TABLE1 left outer join Table2 on Table1.pk_column=Table2.pk_column where Table2.pk_column is null limit 1000;
[...]

如果它仍然太慢,请编写一个在初始表上循环的存储过程。