如何优化包含“in”子查询的MySQL更新?

时间:2013-02-19 17:45:54

标签: mysql sql

如何优化以下update,因为正在为表a中的每一行执行子查询?

update 
  a 
set 
  col = 1 
where 
  col_foreign_id not in (select col_foreign_id in b)

1 个答案:

答案 0 :(得分:2)

您可以使用没有匹配记录的外部联接,而不是not in

update table1 a
    left join table2 b on a.col_foreign_id = b.col_foreign_id
set a.col = 1
where b.col_foreign_id is null

这应该使用简单的选择类型而不是依赖子查询。

您当前的查询(或者自OP中的示例以来实际工作的查询看起来不像它)是有潜在危险的,因为b.col_foreign_id中的NULL将导致无法匹配,并且您不会更新否行。

如果您想要替换not exists,还可以查看

not in

我不能告诉你这会让你的查询更快,但有一些好的信息here。你必须在你的环境中进行测试。

这是一个SQL Fiddle,它阐明了in,exists和outer join之间的区别(检查返回的行,null处理和执行计划)。