从 MySQL 表中删除重复条目的最有效方法

Most efficient way to delete duplicate entries from MySQL tables

我们有一个 table(姑且称之为 originalTbl),其中包含我们要删除的重复条目。重复是指 AUTO INCREMENT 索引字段以外的所有值都相同。一种方法是创建一个新的 table,就像现有的 table(我们称它为 uniqueTbl),然后进行如下查询:

INSERT INTO uniqueTbl (non-Index-field_1, non-Index-field_2, …, non-Index-field_n)
SELECT DISTINCT non-Index-field_1, non-Index-field_2, …, non-Index-field_n FROM originalTbl;

稍后我们将删除 originalTbl 并将 uniqueTbl 重命名为 originalTbl


但是,我正在寻找一种替代方法,它将直接从 originalTbl 中删除重复条目,而无需首先创建 uniqueTbl 然后将其重命名为 originalTbl 的开销].

一个选项使用自连接。假设您有除 id 之外的三列,它看起来像:

delete t
from mytable t
inner join (
    select col1, col2, col3, min(id) minid 
    from mytable
    group by col1, col2, col3
) t1
    on  t.col1 = t1.col1
    and t.col2 = t1.col2
    and t.col3 = t1.col3
    and t.id > t.minid

这将删除重复项并保留最小的行 id

也就是说,您最初展示的方法很可能比这快得多。通过重命名 table 获得的开销非常小。

除非您的重复项很少,否则您的方法会快得多。如果你只有几个(比如不到1%),那你可以试试:

delete o
    from originalTbl o left join
         (select col1, col2, . . ., min(id) as min_id
          from originalTbl o
          group by col1, col2, . . .
         ) oo
         on oo.min_id = o.id
    where oo.min_id is null;