我需要知道從非常大的表中刪除重複行的最有效方式(在此表中有超過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