簡體   English   中英

如何更快地刪除重復項?

[英]How to make delete duplicates faster?

在一個大約1.7M行的表上,我試圖刪除重復的帖子:

delete a FROM comment a
  INNER JOIN comment a2
     WHERE a.id < a2.id
     AND   a.body = a2.body;

結果是:

  Query OK, 35071 rows affected (5 hours 36 min 48.79 sec)

這發生在我幾乎空閑的工作站上,配備Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz 我想知道是否有一些技巧可以讓這個刪除操作更快?

對於MySQL,你可以嘗試(假設行具有完全相同的列信息):

ALTER IGNORE TABLE comment ADD UNIQUE INDEX idx_name (id, body);

資源

以下查詢對您有用。

Delete  YourTableName 
From    (
Select  row_number() over(Partition by ColName1,ColName2,ColName3 order by ColName1,ColName2,ColName3 Asc)As RowNumber
        )YourTableName
Where   YourTableName.RowNumber>1

如果它的工作友好地標記為答案

您的查詢正在嘗試對同一行進行大量刪除。 例如,如果您有這些數據:

body   id
  a     1
  a     2
  a     3
  a     4

然后您的查詢嘗試以下刪除:

 c.body   c.id  c2.id
  a         1      4
  a         1      3
  a         1      2
  a         2      4
  a         2      3
  a         3      4

您可以看到這將如何導致數據庫的大量工作,因為給定body上的id數量增加。

您可以使用group by來解決此問題:

delete c 
    from comment c join
         (select c2.body, max(c2.id) as max_id
          from comment c2
          group by c2.body
         ) c2
         on c2.body = c.body and c.id < c2.max_id;

此外,您需要comment(body, id)的索引。

您可能還會發現反連接比您嘗試的連接更有效:

delete c 
    from comment c left join
         comment c2
         on c2.body = c.body and c2.id > c.id
    where c2.id is null;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM