删除大型表中的重复项

删除大型表中的重复项

问题描述:

我有一个相当大的表,其中有19 000 000条记录,并且存在重复行的问题。即使在这里,还有很多类似的问题,但他们中没有一个似乎给我一个满意的答案。需要考虑的几点:删除大型表中的重复项

  • 行唯一性由两列location_iddatetime确定。
  • 我想尽可能快地执行执行时间(< 1小时)。
  • 复制表格不是很可行,因为表格大小为几个千兆字节。
  • 无需担心关系。

如前所述,每个location_id只能有一个不同的datetime,我想删除所有重复的实例。由于数据是相同的,它们中的哪一个存活并不重要。

任何想法?

+3

考虑暂时删除索引,如果存在触发器。 – Pentium10 2010-03-05 10:17:34

+0

在http://*.com/questions/1585412/sql-to-delete-duplicate-records-in-a-table中给出的方法有什么问题? – Mike 2010-03-05 10:17:39

+0

@ Pentium10,好点,可以加快速度,但如果我使用子查询解决方案,也可能会导致性能下降。 – 2010-03-05 10:25:15

我认为你可以使用这个查询从表中

ALTER IGNORE TABLE table_name ADD UNIQUE (location_id, datetime) 

删除重复记录在此之前,只是先用一些示例数据进行测试..然后试试....

注意:在5.5版上,它适用于MyISAM,但不适用于InnoDB。

+0

这看起来很有前途,我之前没有听说过此功能。现在尝试一下,我会告诉你结果如何。并欢迎来到:) – 2010-03-05 11:19:53

+6

这工作,谢谢。花了31分钟时间,经过16 982 040行,共有1 589 908个副本。我不敢相信这可能是这么简单,没有额外的表格或复杂的查询。 :) – 2010-03-05 12:10:29

+0

@Vinodkumar Saravana,我用InnoDB运行5.5,我读了你的笔记,但我试过了,只是为了确定。 (当然它不起作用),但是你能解释为什么它在InnoDB上不起作用吗? – tixastronauta 2013-04-04 08:21:26

SELECT *, COUNT(*) AS Count 
FROM table 
GROUP BY location_id, datetime 
HAVING Count > 2 

UPDATE table SET datetime = null 
WHERE location_id IN (
SELECT location_id 
FROM table as tableBis 
WHERE tableBis.location_id = table.location_id 
AND table.datetime > tableBis.datetime) 

SELECT * INTO tableCopyWithNoDuplicate FROM table WHERE datetime is not null 

DROp TABLE table 

RENAME tableCopyWithNoDuplicate to table 

所以,你跟上较低日期时间就行了。我不知道关于PERF,这取决于你的表列,服务器等...

该查询适用于所有情况:针对200万行的引擎:MyIsam进行了测试。

ALTER TABLE忽略表名ADD UNIQUE(LOCATION_ID,日期时间)

您可以使用这些步骤删除重复的: 1导出以下查询的结果为txt文件:

select dup_col from table1 group by dup_col having count(dup_col) > 1 

2-加这第一的上述txt文件,并运行最终查询:

delete from table1 where dup_col in (.....) 

请注意,“...”是txt文件的创建我的内容第一步。