0

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

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 - 很快,但我不知道如何执行后续的“插入忽略”步骤

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

在 100K 记录块中进行插入/选择 - 这可以避免数据库超时,但速度很慢。

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

4

1 回答 1

1

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

这种方法利用了 SQL/MySQL 的集合操作优势——无需 Perl 编码。

于 2012-04-19T15:53:43.027 回答