如何在MySQL中使用IN子句更新时避免全表扫描



我得到了两个MySQL表:termlist和blacklist。它们都在字段"term"上有索引,黑名单在字段"status"上有另一个索引。

我想更新术语列表中的状态,也出现在黑名单中,状态为'A',到'B',我发出这个SQL语句:

update termlist set status = 'B' where term in (select term from blacklist where status = 'A')

将导致对termlist进行全表扫描。我想使用'update with inner join',但我不能,因为在select语句中有一个where子句。

我知道我可以从select语句中创建一个临时表,然后更新临时表的内连接,但如果我想多次更新这个表,这有点乏味。

是否有一个单独的更新语句可以在不扫描全表的情况下完成工作?

您可以使用:

update termlist t inner join blacklist b 
    on t.term=b.term
    set t.status = 'B' 
    where b.status = 'A'

相关内容

  • 没有找到相关文章

最新更新