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

标签 mysql in-clause full-table-scan

我有 2 个 MySQL 表:termlist 和 blacklist。他们都有字段“术语”的索引,而黑名单在字段“状态”上有另一个索引。

我想将术语列表中的术语状态更新为“B”,这些术语也出现在黑名单中,状态为“A”,我发出此 SQL 语句:

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

它会导致对 termlist 进行全表扫描。我想使用“使用内部连接更新”,但我不能,因为 select 语句中有一个 where 子句。

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

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

最佳答案

您可以使用:

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

关于mysql - 在MySQL中使用IN子句更新时如何避免全表扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32315480/

相关文章:

sql - 为什么左连接会导致优化器忽略索引?

php - PDO 实现 mysqli 还是 mysql

mysql - 仅当所有指定条件都为 true 时才连接表的 SQL

Mysql 使用子查询插入

mysql - 如何并行扫描一个大的mysql表?

SQLite:优化表扫描

php - 从 MySQL 到 Highcharts 的日期数据

mysql - 计算一列中的多个值

sql - MySQL "in clause"内的项目数

mysql - MySQL中的空IN子句参数列表