有没有一种更快的方法可以从一张桌子上去除复制品?

时间:2019-03-29 11:45:34

标签: mysql

我有一个184k记录表,并且通过键concat(tradedate,stock_short)有一些重复项。我的方法是:

Delete from levermannwithoutdub where recnum not in
(Select max(recnum) from leverman groub by concat(tradedate,stock_short));

levermanwithoutdubleverman的开头都是相同的。

但是该操作现在需要15000秒,并且仍在工作。

有没有一种更快的方法来删除应保留重复项的max(recnum)的重复项?

我试图理解下面的尝试:

only one stock?

但是我仍然有大约2500个重复项,最多有38条相同记录。

Here is my check

如何在所有2528个重复项上运行它?

Faszit: 我已经完成以下工作:  创建一个空的相同表,其索引唯一于(tradedate,stock_short)。  导出具有recnum降序的旧表。  通过Workbench导入它并忽略错误。

只花了5分钟左右。 我知道这不是复杂的方法,但是比 删除一组SETUM。

此外:我发现:Tutorial  从我这样做的地方:

    DELETE t1 FROM levermann t1
    INNER JOIN
    lev_mitdup_Lnotnull t2 
    WHERE
     t1.recnum < t2.recnum AND concat(t1.tradedate,t1.stock_short) = 
     concat(t2.tradedate,t2.stock_short);

1 个答案:

答案 0 :(得分:2)

确保您在表杠杆手列上有索引(tradedate,stock_short) 避免使用concat来确定where和group by,并使用子查询来减少仅在重复行上的搜索

Delete twd
from levermannwithoutdub  twd
inner join (
  SELECT max(recnum)  max_recnum
  FROM leverman l
  INNER JOIN (
    SELECT  tradedate,stock_short
    FROM leverman 
    GROUP BY tradedate,stock_short 
    HAVING COUNT(*) > 1 
  ) t ON  t.tradedate = l.tradedate 
        AND  t.stock_short = l.stock_short  
) r on  r.max_recnum = twd.recnum 

如果您不仅具有重复的值而且具有三倍的值,那么您需要再次运行删除查询

您可以检查

的价值
    SELECT  tradedate,stock_short, count(*) dup
    FROM leverman 
    GROUP BY tradedate,stock_short 
    HAVING COUNT(*) > 1 
    ORDER BY dup desc

在每个交易日,您有很多重复的事实,stock_short 您还可以尝试删除所有与交易日期,stock_short匹配且为<>那是max_recnum

的行。
Delete  twd
from levermannwithoutdub  twd
inner join (
  SELECT max(l.recnum)  max_recnum, t.tradedate, t.stock_short
  FROM leverman l
  INNER JOIN (
    SELECT  tradedate,stock_short
    FROM leverman 
    GROUP BY tradedate,stock_short 
    HAVING COUNT(*) > 1 
  ) t ON  t.tradedate = l.tradedate 
        AND  t.stock_short = l.stock_short  
) r on  r.max_recnum <>   twd.recnum 
      AND  r.tradedate = twd.tradedate 
        AND  r.stock_short = twd .stock_short  
相关问题