我有两张桌子:食物和moos。
- foos 在 start_date 被索引
- moos 有 foos.id 作为外键
foos 非常大(数百万条记录)。moos 不是(10 万条记录)。
我需要做一些相当简单的事情:从 foos 中删除 start_date < X 且未在 moos 中引用的记录。我希望这不是一个太具体的问题,但我无法让它工作(它永远挂起)我尝试了我认为是“通常”的方式:
delete foos FROM foos LEFT JOIN moos ON foos.id = moos.foo_id WHERE moos.foo_id is null AND foos.start_date < "2013-05-30";
delete foos FROM foos WHERE start_date < "2013-05-30" AND id NOT IN (select foo_id from moos where foo_id is not null);
我应该补充:
我总是选择 X,这样我就知道 start_date < X 的 moos 数量不大(<> 200/300k 记录)
只有几千个moos引用了一个foo
我在 mySQL 5.5 上,所以我无法解释“删除”,但是当我用“选择 1”替换时,解释表明 mySQL 正在做我认为它会做的事情:
- 首先使用 start_date 索引找到正确的 foo
- 然后看看 moos,所以它不应该是这么“长”的交易......</li>
有没有更好的方法来做到这一点,或者我错过了什么?
谢谢,
PJ