mysql - 有没有一种更快的方法来从一个表中删除重复项?

标签 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 秒并且仍在工作。

是否有更快的方法来删除应保留最大(recnum)重复项的重复项?

我试图理解下面的尝试:

only one stock?

但我仍然有大约 2500 个重复项,其中同一记录最多 38 个副本。

Here is my check

如何在所有 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/

相关文章:

php - Mysql 左连接返回多于一行

php - 如何在具有多个数据库的 Laravel 5.7 应用程序中从替代数据库获取特定数据

mysql - 删除重复的 MySQL 记录?

php - htaccess 和自定义 php cms 漂亮的 url

mysql - 如何从mysql上的每个类别获取最大id?

来自子查询的 MySQL GROUP_CONCAT

mysql - 在查询中引用 MySQL "AS"值的任何方法?

php - MySQL统计一张表中最大的引用路径

php - 如何获得 UNION ALL 的总和

MySQL查询帮助请加入多个表