我有一个大约有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上搜索了一下,但没有好的答案,除了增加硬件配置之外,还有什么想法吗。
4条答案
按热度按时间hzbexzde1#
使用
join
取而代之的是:mysql不太擅长优化
update
以及delete
查询。它可能会为每一行运行一次子查询,这就是为什么会有超时的原因。uqjltbpv2#
在我看来,当数据库很大并且基于许多事务时,就会发生这种情况。试着从以下问题开始,但从长远来看,您需要优化数据库
例如,运行以下命令:
编辑:
我在这个地方也发现了类似的问题
qzwqbdag3#
我认为你的第五行没有必要。括号中的查询足以得出所有最低出价。
k10s72fa4#
我认为你的第五行没有必要。括号中的查询足以显示所有最小HID。
从hid不在的历史记录中删除(选择min(hid)from…)
.