可以从MySQL删除消除“NOT IN”子查询?

时间:2014-06-03 22:56:15

标签: mysql optimization subquery mariadb

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

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

以下是我现在的查询:

delete d from tableD as d
where d.id not in (
    select c.f_id from tableC as c
    where seq>1401399893702598
);

虽然这样做了,但是这个查询将针对大型表运行,在GB范围的10s内有数百万行。它不需要是实时的,但更快更好。所以我试图找出是否有可能消除这个子查询,可能用连接替换它。我认为我必须将此作为单个查询保留,因为可以随时将行添加到任一表中,并且不应出于任何原因删除这些新行。

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

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

我正在使用MySQL 5.6。

1 个答案:

答案 0 :(得分:0)

您需要将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;