2010-10-26 70 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