可能消除;不在「;从MySQL删除子查询?

可能消除;不在「;从MySQL删除子查询?,mysql,optimization,subquery,mariadb,Mysql,Optimization,Subquery,Mariadb,我有两个InnoDB表,我们称它们为tableD和tableC。TableD有一个名为id的varchar主键行。TableC有一个名为seq的BIGINT主键行和另一个名为f_id的varchar列。f_id的值不是唯一的,对应于TableC中的id列 我试图实现的是从tableD中删除所有行,除了那些与tableC中任何行中的f_id列匹配且seq column值大于特定值的行 以下是我现在的疑问: delete d from tableD as d where d.id not in (

我有两个InnoDB表,我们称它们为tableD和tableC。TableD有一个名为id的varchar主键行。TableC有一个名为seq的BIGINT主键行和另一个名为f_id的varchar列。f_id的值不是唯一的,对应于TableC中的id列

我试图实现的是从tableD中删除所有行,除了那些与tableC中任何行中的f_id列匹配且seq column值大于特定值的行

以下是我现在的疑问:

delete d from tableD as d
where d.id not in (
    select c.f_id from tableC as c
    where seq>1401399893702598
);
在执行此任务时,此查询将针对大型表运行,在10s的GB范围内,有数百万行。它不需要是实时的,但越快越好。所以我试图找出是否有可能消除这个子查询,可能用一个连接来代替它。我认为我必须将其保留为单个查询,因为行可以随时添加到任何一个表中,并且不应出于任何原因删除这些新行

到目前为止,我所有的尝试都失败了。我得到的已关闭查询是以下查询,它只删除我要保留的行,并保留所有其他行:

delete d from tableD as d
    left join tableC as c on d.id=c.f_id
    where c.seq>1401399893702598;

我正在使用MySQL 5.6。

您需要将
seq
上的条件移动到
on
子句,并在
where
子句中测试是否没有匹配项:

delete d
    from tableD as d left join
         tableC as c
         on d.id = c.f_id and c.seq > 1401399893702598
    where c.f_id is null;