MySQL如何从非常大的表中删除重复的行?

时间:2014-04-24 00:24:26

标签: mysql sql

我需要知道从非常大的表中删除重复行的最有效方法(此表中超过10亿行)所以我需要知道一种非常有效的方法来执行此操作,因为如果执行无效,这可能需要数天查询。

我需要删除搜索表中的所有重复网址

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

2 个答案:

答案 0 :(得分:0)

完全取决于您的索引。分两步完成:(1)在URL字段上创建DBMS支持的最高选择性索引,以及可以区分具有相同URL的记录的任何其他字段,例如主键或时间戳字段; (2)编写程序代码(不仅仅是一个查询)来处理一小部分,如果一次记录并提交这些小批量,例如按PK mod 1000切片,或.TLD部分之前的URL的3个字符。

这是获得可预测结果的最佳方法,除非您确定数据库进程在删除直接查询所需的长周期期间不会耗尽内存,日志文件空间等。

答案 1 :(得分:-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
)