如何更快地删除副本?

时间:2019-06-07 09:51:38

标签: mysql sql sql-delete

在一张约有170万行的表上,我试图删除重复的帖子:

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工作站上。 我想知道是否有一些技巧可以使此删除操作更快?

3 个答案:

答案 0 :(得分:0)

特别是对于MySQL,您可以尝试(假设行具有完全相同的列信息):

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

Source

答案 1 :(得分:0)

以下查询将对您有用。

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

如果工作正常,请标记为答案

答案 2 :(得分:0)

您的查询正在尝试对同一行进行不计其数的删除。例如,如果您有以下数据:

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

随着给定idbody的数量增加,您会看到这将如何为数据库带来很多工作。

您可以改用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;