更新语句中不存在需要更多时间

时间:2010-10-26 23:32:44

标签: mysql sql sql-update

在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秒才能运行,我想要毫秒级的东西。

3 个答案:

答案 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