2014-02-26 60 views
0
我有從SELECT語句更新表的問題

...這是命令:更新慢查詢

UPDATE CrashReport SET STATUS = '2' WHERE id IN (
    SELECT report_id 
    FROM CrashInfo 
    WHERE info_title LIKE 'STACK_TRACE_ID' 
    AND info_value IN (
     SELECT info_value 
     FROM CrashInfo 
     WHERE report_id = **report_id** 
     AND info_title = 'STACK_TRACE_ID' 
    ) 
) 

,我路過這個疑問將是在REPORT_ID參數子查詢... select選擇0.113秒來單獨執行,但更新查詢總共需要4.868秒來執行。是否因爲更新查詢將在表的每一行上執行select語句?我怎樣才能讓這個更快?

謝謝

+0

最後選擇只返回1個值? – Hackerman

+0

是的最後一個查詢返回1值 – Philibobby

回答

1

事情是這樣的:

SET @myVal = (
    SELECT info_value 
    FROM CrashInfo 
    WHERE report_id = **report_id** 
    AND info_title = 'STACK_TRACE_ID'); 

UPDATE CrashReport SET STATUS = '2' WHERE id IN (
SELECT report_id 
FROM CrashInfo 
WHERE info_title LIKE 'STACK_TRACE_ID' 
AND info_value IN (@myVal) 
) 
+0

它的工作!我不確定這個解決方案是否超級乾淨,但速度更快!謝謝。 – Philibobby

+0

我很樂意提供幫助...隨時提問;) – Hackerman

0

IN有時可能會很慢在MySQL。你可以修改你的使用join S(即使在update)查詢:

UPDATE CrashReport cr join 
     (SELECT report_id 
     FROM CrashInfo ci join 
      info_value iv 
      on report_id = **report_id** AND 
       info_title = 'STACK_TRACE_ID' 
     ) cir 
     on cr.id = cir.id 
    SET cr.STATUS = '2'; 

當我看到這一點,它看起來像CrashInfoinfo_value之間的連接條件丟失。這兩個表中是否應該有一些相同的字段?這將解釋糟糕的表現。

+0

表CrashReport包含一個ID, 表CrashInfo包含一個ID,一個report_id,一個標題,一個值 – Philibobby