【问题标题】:mysql: removing duplicates while avoiding client timeoutmysql:在避免客户端超时的同时删除重复项
【发布时间】:2012-04-19 23:53:43
【问题描述】:

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

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 记录块中进行插入/选择 - 这可以避免数据库超时,但速度很慢。

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

【问题讨论】:

标签: mysql perl


【解决方案1】:

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

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

【讨论】:

  • 我想这就是问题所在 - 任何 select * 都会超时。而且我需要知道所有列才能找到重复项。
猜你喜欢
  • 2019-05-05
  • 2012-04-17
  • 1970-01-01
  • 2018-03-31
  • 2016-06-22
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多