我有一个约有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
我用谷歌搜索,但没有一个好的答案,除了增加硬件配置外,还有什么想法。
答案 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在优化update
和delete
查询方面不是很擅长。可能每行都运行一次子查询,这就是为什么超时的原因。