我有一个 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 秒并且仍在工作。
是否有更快的方法来删除应保留最大(recnum)重复项的重复项?
我试图理解下面的尝试:
但我仍然有大约 2500 个重复项,其中同一记录最多 38 个副本。
如何在所有 2528 个重复项上运行它?
法西特: 我做了以下事情: 创建一个空的相同表,其索引唯一于 (tradedate,stock_short)。 以 renum 降序导出旧表。 通过 Workbench 导入并忽略错误。
只花了大约5分钟。 我确实知道这不是复杂的方法,但它比 通过一组renums删除它。
此外:我发现: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)上有索引 避免使用 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
如果您有更多的值,不仅是重复的,而且是三重或更多,您需要再次运行删除查询
您可以使用
查看您的值(value) SELECT tradedate,stock_short, count(*) dup
FROM leverman
GROUP BY tradedate,stock_short
HAVING COUNT(*) > 1
ORDER BY dup desc
事实上,每个交易日期都有很多重复的实例,stock_short 您还可以尝试删除与 tradedate、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
关于mysql - 有没有一种更快的方法来从一个表中删除重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55416767/