mysql:删除重复项,同时避免客户端超时

时间:2012-04-19 13:38:26

标签: mysql perl

问题:数百个相同的(架构)表。其中一些有一些需要删除的重复数据。我通常的策略是:

walk list of tables - for each do
create temp table with unique key on all fields
insert ignore select * from old table
truncate original table
insert select * back into original table
drop or clean temp table

对于较小的表,这可以正常工作。不幸的是,我正在清理的表通常有数百万条记录,因此我的工作和客户端连接在我运行时会超时。 (因为有数百个这样的表我使用Perl来遍历列表并清理每个表。这是超时发生的地方。)

我正在研究的一些选项:

  

mysqldump - 快但我不知道如何进行后续的'插入忽略'步骤

     

进入outfile / load infile - 也很快,但是我从远程主机运行,'into outfile'创建了mysql服务器上的所有文件。很难清理。

     

在100K记录的块中进行插入/选择 - 这可以避免db超时,但速度非常慢。

我确信有更好的方法。建议?

1 个答案:

答案 0 :(得分:0)

如果查找重复项的SQL查询可以在没有超时的情况下完成,我认为您应该能够使用带有WHERE子句的Count()运算符执行SELECT,该子句将输出限制为仅具有重复数据的行(Count (DUPEDATA)> 1)。此SELECT的结果可以放在一个临时表中,然后可以与DELETE查询的主表连接。

这种方法使用SQL / MySQL的集合操作优势 - 不需要Perl编码。