【发布时间】:2013-10-27 06:00:35
【问题描述】:
我有两张桌子。我们称它们为 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)
);
现在,我的问题。 VALUE 中的所有 key_id 大约有一半已从 KEY 中删除,我需要在两个表仍处于高负载状态时有序地删除它们。
这很容易做到
delete v
from VALUE v
left join KEY k using (key_id)
where k.key_id is null;
但是,由于不允许在多表删除时使用limit,因此我不喜欢这种方法。这样的删除需要几个小时才能运行,因此无法限制删除。
另一种方法是创建游标来查找所有丢失的key_id,并有限制地将它们一个一个删除。这似乎很慢而且有点倒退。
还有其他选择吗?一些有用的技巧?
【问题讨论】:
-
有时
WHERE NOT EXISTS比LEFT JOIN [...] IS NULL快,但在这种情况下不确定 (stackoverflow.com/questions/6777910/…)。希望它会有所帮助! -
你的意思是你已经删除了key,现在要删除VALUE中的孤儿记录,是吗?
-
好吧,至少那是完全相同的问题:)
标签: mysql