在一张约有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
工作站上。
我想知道是否有一些技巧可以使此删除操作更快?
答案 0 :(得分:0)
特别是对于MySQL,您可以尝试(假设行具有完全相同的列信息):
ALTER IGNORE TABLE comment ADD UNIQUE INDEX idx_name (id, body);
答案 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
随着给定id
上body
的数量增加,您会看到这将如何为数据库带来很多工作。
您可以改用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;