2017-06-22 35 views
0

我有一个包含重复项的约250万行Table1的表。 我创建了一个具有相同列名称的新表格Table2,但具有我想要的列的唯一索引。将具有重复项的大表插入到具有mysql的唯一密钥的新表中

我想从表1中插入数据到表2,删除重复的方式。我用这个查询:

INSERT IGNORE INTO Table2 SELECT * FROM TABLE1; 

问题是,一个半小时的运行时间是不够的,这个过程要经过。有关如何实现这一目标的任何建议?是否有简单的方法通过块传输数据,即使Table1中没有按线性排序的索引?

+0

为什么半个小时有关? – RiggsFolly

+0

@RiggsFolly这只是迄今为止我尝试过的最大值,看起来相当长,不是吗? – Mariah

+0

你看过创建的行吗?如果它们看起来正确,那就让它运行。最后你只会运行一次 – RiggsFolly

回答

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; 
[...] 

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

+0

限制条款帮助了我;只有大约200万我需要将抵消限制到100,000。直到那时500,000工作得足够快。 – Mariah

+0

你可以使用你想要的限制,大多数情况下,当你选择一个更高的限制时,每秒插入的行数会增加,有时候不会,另一个问题是如果你有并发事务或复制,长查询可能会产生麻烦。如果你的问题解决了,请把你的问题放在答案上。 –

相关问题