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版本?