2014-04-24 89 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