我需要知道从非常大的表中删除重复行的最有效方式(在此表中有超过10亿行),所以我需要知道一个非常有效的方法,因为如果我执行无效查询。MySQL如何从非常大的表中删除重复的行?
我需要删除所有重复的URL搜索表,
即
DELETE FROM search WHERE (url) NOT IN
(
SELECT url FROM
(
SELECT url FROM search GROUP BY url
) X
);
我需要知道从非常大的表中删除重复行的最有效方式(在此表中有超过10亿行),所以我需要知道一个非常有效的方法,因为如果我执行无效查询。MySQL如何从非常大的表中删除重复的行?
我需要删除所有重复的URL搜索表,
即
DELETE FROM search WHERE (url) NOT IN
(
SELECT url FROM
(
SELECT url FROM search GROUP BY url
) X
);
完全取决于你的索引。这样做分两步进行:(1)创建您的DBMS在URL字段中支持的最高选择性索引,并将其与任何其他可以区分具有相同URL的记录的字段结合使用,例如主键或时间戳字段; (2)如果一次记录和提交导致这些小批量,例如写入程序代码(而不仅仅是查询)来处理一小部分。由PK mod 1000切片,或者.TLD部分之前的URL的3个字符。
这是有一个可预见的结果,最好的办法,除非你确信的删除直查询将需要很长周期内DB过程不会耗尽内存,日志文件的空间等。
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
)
一些解释为什么这会有所帮助将是有用的。 – Paddy
我不认为你可能会得到不同于** **相关**问题的答案。 – Barmar
我目前在性能测试表上测试这个答案,看看它需要多长时间 – mahen3d
@ mahen3d:您建议的查询看起来像是要从表中删除每一行(如果没有带有“url”的行NULL值),或者不删除任何行(如果有任何行的“url”值为NULL)。对于一个非常大的表,问题不仅仅是总时间,而是需要完成的工作量(InnoDB的锁定,日志记录和回滚)。如果这个行的比例非常大,那么可以考虑创建一个新表,然后只复制要保留的旧表中的行。即使您必须重新创建外键,这通常也会更快。 – spencer7593