【问题标题】:Most efficient way to delete duplicate entries from MySQL tables从 MySQL 表中删除重复条目的最有效方法
【发布时间】:2020-11-22 03:00:44
【问题描述】:

我们有一个表(我们称之为originalTbl),其中包含我们要删除的重复条目。重复是指除了 AUTO INCREMENT 索引字段之外的所有值都是相同的。一种方法是创建一个新表,就像现有表一样(我们称之为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 的开销。

【问题讨论】:

  • 您的方法将比删除原始表中的条目快得多——除非您的重复项很少。

标签: mysql sql duplicates mariadb sql-delete


【解决方案1】:

一个选项使用自联接。假设您有除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 的行。

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

【讨论】:

  • 这是一个糟糕的建议。它将尝试多次删除同一行。
  • 。 .我应该更精确。如果一百万条记录中有 10 个重复并且单个组只重复一次,那么您的原始版本就可以了。作为一个通用解决方案,这是一个糟糕的建议。早上好(我现在是早上)。
  • 早上好@GordonLinoff!是的,我明白你的意思,没问题。我在加入之前将查询更改为聚合,因此如果有多个重复项,则每个只选择/删除一次。干杯。
【解决方案2】:

除非您的重复项很少,否则您的方法会快得多。如果你只有几个(比如不到 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;

【讨论】:

    猜你喜欢
    • 2021-05-19
    • 1970-01-01
    • 2011-05-23
    • 2015-08-02
    • 2019-12-10
    • 2012-04-10
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    相关资源
    最近更新 更多