我有一个184k记录的表,并按concat(tradedate,stock_short)键有一些重复项。我的方法如下:Delete from levermannwithoutdub where recnum not in(Select max(recnum) from leverman groub by concat(tradedate,stock_short));表levermanwithoutdub和leverman开头都是相同的。但是该操作现在需要15000秒,并且仍在工作。有没有一种更快的方法来删除应保留重复项的max(recnum)的重复项?我试图理解下面的尝试:但是我仍然有大约2500个重复项,最多有38条相同记录的副本。如何在所有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); 最佳答案 确保在表杠杆手列上有索引(tradedate,stock_short)避免使用concat来确定where和group by,并使用子查询来减少仅在重复行上的搜索Delete twdfrom levermannwithoutdub twdinner 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 twdfrom levermannwithoutdub twdinner 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关于mysql - 有没有一种更快的方法从一个表中删除重复项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55416767/ 10-10 14:58