我有两张桌子.我们称之为KEY和VALUE.
KEY很小,约有1.000.000条记录.
VALUE很大,比如1.000.000.000记录.
在它们之间存在一个连接,使得每个KEY可能具有许多VALUES.它不是外键,但基本上是相同的含义.
DDL看起来像这样
create table KEY (
key_id int,
primary key (key_id)
);
create table VALUE (
key_id int,
value_id int,
primary key (key_id, value_id)
);
Run Code Online (Sandbox Code Playgroud)
现在,我的问题.VALUE中大约一半的key_id已从KEY中删除,我需要以有序的方式删除它们,而两个表仍然处于高负荷状态.
这很容易做到
delete v
from VALUE v
left join KEY k using (key_id)
where k.key_id is null;
Run Code Online (Sandbox Code Playgroud)
但是,因为它不允许limit有多表删除我不喜欢这种方法.这样的删除需要几个小时才能运行,这使得无法限制删除.
另一种方法是创建游标以查找所有缺少的key_ids并逐个删除它们.这似乎非常缓慢,有点倒退.
还有其他选择吗?一些可以帮助的好技巧?
我在InnoDB表上有一个mysql查询,如下所示:
UPDATE items SET qty = qty + 5 WHERE item_id = 1234 LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
我需要为此使用交易吗?不使用交易会发生什么不良事件吗?