在mysql中删除相同数据时总是出错

yzxexxkh  于 2021-06-20  发布在  Mysql
关注(0)|答案(4)|浏览(251)

我有一个大约有1000000行的表,我需要删除相同的数据,所以我使用下面的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 是主的,自动递增,如果invitedkey、userkey、charge相同,则保留一个最小hid的数据。但是我在sql上面运行,总是会出错

Lock wait timeout exceeded; try restarting transaction

我在google上搜索了一下,但没有好的答案,除了增加硬件配置之外,还有什么想法吗。

hzbexzde

hzbexzde1#

使用 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不太擅长优化 update 以及 delete 查询。它可能会为每一行运行一次子查询,这就是为什么会有超时的原因。

uqjltbpv

uqjltbpv2#

在我看来,当数据库很大并且基于许多事务时,就会发生这种情况。试着从以下问题开始,但从长远来看,您需要优化数据库
例如,运行以下命令:

SET GLOBAL innodb_lock_wait_timeout = 4000; 
SET innodb_lock_wait_timeout = 4000;

编辑:
我在这个地方也发现了类似的问题

qzwqbdag

qzwqbdag3#

我认为你的第五行没有必要。括号中的查询足以得出所有最低出价。

k10s72fa

k10s72fa4#

我认为你的第五行没有必要。括号中的查询足以显示所有最小HID。
从hid不在的历史记录中删除(选择min(hid)from…)
.

相关问题