在MySQL中,
update table1 t1
set column1 = 100,
column2 = 200
where column3 > 500
and not exists(select *
from table2
where column1 = t1.column1);
此查询执行起来非常耗时,还有其他更快速的重写方法。
for table2 ID是主列,所以我想我可以重写为
update table1 t1
set column1 = 100,
column2 = 200
where column3 > 500
and not exists(select ID
from table2
where column1 = t1.column1);
但是查询仍然需要2秒才能运行,我想要毫秒级的东西。
答案 0 :(得分:2)
尝试此操作(不使用相关的子查询):
UPDATE Table1
SET Column1 = 100, Column2 = 100
WHERE Column3 > 500
AND Column1 NOT IN (SELECT Column1 FROM Table2);
答案 1 :(得分:2)
请改为尝试:
UPDATE TABLE1
LEFT JOIN TABLE2 ON TABLE2.column1 = TABLE1.column1
AND TABLE2.column2 IS NULL
SET column1 = 100,
column2 = 200
WHERE TABLE2.column1 IS NULL
AND column3 > 500
答案 2 :(得分:0)
当使用Not exists时,一旦查询处理器找到一行,它就可以停止,但如果该行确实不存在,那么它必须在它之前检查整个表(对于子查询中定义的列)确定该行不存在...所以加速它的唯一方法是,如果子查询中有任何过滤器,则在这些列上放置一个或多个索引。在您的情况下,这将意味着Table2.column1
上的索引使用连接可能不是一种帮助,因为无论是连接还是不存在子查询,查询处理器都必须执行相同的逻辑IO来处理数据。
要使用连接,(我不确定MySql语法,它可能是:P
UPDATE TABLE1 SET
column1 = 100,
column2 = 200
From Table1 t1
Left Join TABLE2 t2
ON t2.column1 = t1.column1
WHERE t2.column1 Is Null
或
Update t1 Set
column1 = 100,
column2 = 200
From Table1 t1
Left Join Table2 t2
ON t2.column1 = t1.column1
Where t2.column1 Is Null