2014-04-24 88 views
-1

我需要知道从非常大的表中删除重复行的最有效方式(在此表中有超过10亿行),所以我需要知道一个非常有效的方法,因为如果我执行无效查询。MySQL如何从非常大的表中删除重复的行?

我需要删除所有重复的URL搜索表,

DELETE FROM search WHERE (url) NOT IN 
(
SELECT url FROM 
(
SELECT url FROM search GROUP BY url 
) X 
); 
+2

我不认为你可能会得到不同于** **相关**问题的答案。 – Barmar

+0

我目前在性能测试表上测试这个答案,看看它需要多长时间 – mahen3d

+0

@ mahen3d:您建议的查询看起来像是要从表中删除每一行(如果没有带有“url”的行NULL值),或者不删除任何行(如果有任何行的“url”值为NULL)。对于一个非常大的表,问题不仅仅是总时间,而是需要完成的工作量(InnoDB的锁定,日志记录和回滚)。如果这个行的比例非常大,那么可以考虑创建一个新表,然后只复制要保留的旧表中的行。即使您必须重新创建外键,这通常也会更快。 – spencer7593

回答

0

完全取决于你的索引。这样做分两步进行:(1)创建您的DBMS在URL字段中支持的最高选择性索引,并将其与任何其他可以区分具有相同URL的记录的字段结合使用,例如主键或时间戳字段; (2)如果一次记录和提交导致这些小批量,例如写入程序代码(而不仅仅是查询)来处理一小部分。由PK mod 1000切片,或者.TLD部分之前的URL的3个字符。

这是有一个可预见的结果,最好的办法,除非你确信的删除直查询将需要很长周期内DB过程不会耗尽内存,日志文件的空间等。

-1
DELETE from search 
where id not in (
    select min(id) from search 
    group by url 
    having count(*)=1 

    union 

    SELECT min(id) FROM search 
    group by url 
    having count(*) > 1 
) 
+1

一些解释为什么这会有所帮助将是有用的。 – Paddy