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

How to avoid full table scan when update with IN clause in MySQL

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

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

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

它会导致对术语列表进行全面 table 扫描。我想使用 'update with inner join' 但我不能,因为 select 语句中有一个 where 子句。

我知道我可以从那个 select 语句创建一个临时 table 然后用那个临时 table 更新内部连接但是如果我想做这个更新有点乏味很多次。

是否有一种更新语句可以在不完全 table 扫描的情况下完成这项工作?

您可以使用:

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