当我在mysql中删除相同数据时总会出错

时间:2018-08-24 07:57:27

标签: mysql sql

我有一个约有1,000,000行的表,我需要删除相同的数据,因此我使用以下SQL

delete
from history
where hid not in
(
    select hid from
    (
        select min(hid) as hid
        from history
        group by `invitedkey`, `userkey`, `charge`
    ) as b
);

这里hid是主要的,AUTO_INCREMENT,如果被邀请键,用户键,费用相同,则以最小隐藏量保留一个数据。但是我在SQL上面运行,总是出现错误

Lock wait timeout exceeded; try restarting transaction

我用谷歌搜索,但没有一个好的答案,除了增加硬件配置外,还有什么想法。

4 个答案:

答案 0 :(得分:1)

我认为,当数据库很大且基于许多事务时,就会发生这种情况。尝试从以下问题开始,尽管从长远来看,您将需要优化数据库

例如,运行以下命令:

SET GLOBAL innodb_lock_wait_timeout = 4000; 
SET innodb_lock_wait_timeout = 4000; 

编辑:

我在THIS处发现了非常类似的问题

答案 1 :(得分:0)

我认为您的第五行是不必要的。括号中的查询足以带来所有最低出价。

答案 2 :(得分:0)

我认为您的第五行是不必要的。括号中的查询足以显示所有最小隐藏值。

从历史记录中删除 隐藏在哪里(从...中选择min(hid))

答案 3 :(得分:0)

改为使用join

delete h
    from history h left join
         (select invitedkey, userkey, charge, min(hid) as min_hid
          from history h
          group by invitedkey, userkey, charge
         ) hh
         on hh.min_hid = hh.hid
    where hh.min_hid is null;

MySQL在优化updatedelete查询方面不是很擅长。可能每行都运行一次子查询,这就是为什么超时的原因。