2010-10-26 65 views
0

在MySQL中,不存在于更新语句需要更多的时间

update table1 t1 
    set column1 = 100, 
     column2 = 200 
where column3 > 500 
    and not exists(select * 
        from table2 
        where column1 = t1.column1); 

这个查询是太耗费时间执行,确实有重写的任何其他更快捷的方式。

为表2 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

它更新了多少条记录? – 2010-10-26 23:35:17

+0

表1:200K表2:150 K记录。 – Sharpeye500 2010-10-26 23:40:09

回答

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 
+0

谢谢,你能帮助我,我怎么能把上述查询加入,我不能得到它的权利。所以你的意思是说外连接会降低耗时。 – Sharpeye500 2010-10-26 23:39:48

+0

为连接添加了sql,但我不熟悉mysql语法,所以这些可能不完全正确... – 2010-10-26 23:59:17

2

试试这个(不使用相关子查询):

UPDATE Table1 
    SET Column1 = 100, Column2 = 100 
WHERE Column3 > 500 
    AND Column1 NOT IN (SELECT Column1 FROM Table2); 
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 
+0

感谢OMG小马。我很接近,实际上我错过了not exists语句中的这个条件并且不存在(从table2中选择ID,其中column1 = t1.column1和column2为null);我需要添加它,否则它会更新所有记录。 – Sharpeye500 2010-10-26 23:57:11

+0

谢谢,但这是我的查询upate table1 t1 set column1 = 100,column2 = 200 其中column3> 500并且不存在(select * from table2 where column1 = t1.column1 and column2 is null);上面的一个照顾不存在吗? – Sharpeye500 2010-10-27 00:09:36

+0

@ Sharpeye500:我错过了第3列比较 - 更正。否则,NOT IN,NOT EXISTS和LEFT JOIN/ISL NULL是等价的 - 只有当比较的列不能为空(IE:column1)时,LEFT JOIN/IS NULL才会更有效。否则,不在或不存在表现更好。 – 2010-10-27 00:12:39