Mysql 从表中删除所有重复行的最有效方法是什么?
我有一张桌子:Mysql 从表中删除所有重复行的最有效方法是什么?,mysql,duplicate-removal,delete-row,Mysql,Duplicate Removal,Delete Row,我有一张桌子: | foo | bar | +-----+-----+ | a | abc | | b | def | | c | ghi | | d | jkl | | a | mno | | e | pqr | | c | stu | | f | vwx | 我想删除所有foo列中包含重复项的行,以便该表如下所示: | foo | bar | +-----+-----+ | b | def | | d | jkl | | e | pqr | |
| foo | bar |
+-----+-----+
| a | abc |
| b | def |
| c | ghi |
| d | jkl |
| a | mno |
| e | pqr |
| c | stu |
| f | vwx |
我想删除所有foo
列中包含重复项的行,以便该表如下所示:
| foo | bar |
+-----+-----+
| b | def |
| d | jkl |
| e | pqr |
| f | vwx |
最有效的方法是什么?您可以使用
左连接从只返回唯一foo
的子查询中连接表。子查询中不匹配的行将根据需要删除,例如
DELETE a
FROM TableName a
LEFT JOIN
(
SELECT foo
FROM TableName
GROUP BY Foo
HAVING COUNT(*) = 1
) b ON a.Foo = b.Foo
WHERE b.Foo IS NULL
为了提高性能,请在列Foo
上添加索引
ALTER TABLE tableName ADD INDEX(foo)
使用存在
:
DELETE a
FROM TableName a
WHERE EXISTS (SELECT NULL
FROM TableName b
WHERE b.foo = a.foo
GROUP BY b.foo
HAVING COUNT(*) > 1)
在
中使用:
DELETE a
FROM TableName a
WHERE a.foo IN (SELECT b.foo
FROM TableName b
GROUP BY b.foo
HAVING COUNT(*) > 1)
这很好,但速度太慢(我有一个很大的表)。在列上添加一个索引,这样它会执行得更快,例如,altertablename addindex(foo)
,然后查看性能。谢谢,但我已经这样做了。但无论如何,我明白了,这是实现这一点最快的方法。如果我是正确的,那么您在这里编写的exists版本要比in版本快得多。考虑到这一点,是否有任何理由支持in版本?