2017-04-05 42 views
0

我試圖將av.UnitType設置爲ut.unittype中的值,只要三列匹配,並且我想知道該語句的哪些部分是這樣的是導致它採取這麼長時間:爲什麼這個更新查詢如此之慢,我該如何改進它

SET SQL_SAFE_UPDATES=0; 
UPDATE `db`.`table_av` av, `db`.`table_ut` ut 
SET av.UnitType = ut.unittype 
WHERE TRIM(LEADING '0' FROM av.id) = ut.id 
AND av.veh = ut.veh 
AND av.date LIKE CONCAT('%', ut.Year); 
+2

在可以使查詢變慢的事情列表上,最糟糕的是「在比較中使用函數或計算字段值」...像TRIM()和CONCAT()這樣的函數;列表中還有「LIKE條件與領先的通配符」....像'% 「...在風格上,使用」逗號加入「符號已經過時並且幾十年不受歡迎 – Uueerdo

+0

將其更改爲查找相關行的」SELECT「查詢,然後使用」EXPLAIN「查看查詢計劃在這兩個表的'veh'列中添加索引可能會有所幫助 – Barmar

+0

這兩個表的模式是什麼?爲什麼一個ID的前導零和相關的一個沒有? –

回答

1

改變連接到當前使用的語法

SET SQL_SAFE_UPDATES=0; 

UPDATE `db`.`table_av` av, 
    JOIN `db`.`table_ut` ut 
     ON TRIM(LEADING '0' FROM av.id) = ut.id 
      AND av.veh = ut.veh 
      AND av.date LIKE CONCAT('%', ut.Year); 
    SET av.UnitType = ut.unittype 

最後一行應該使用的,而不是像(如果可能的話)的日期功能。更好的是,確保兩列是每個表中的兼容類型(即TIMESTAMP,或者int或varchar中的至少4位數年)。

+0

謝謝,我收到了一個錯誤,因爲該集合在連接之上,但是當我切換他們的位置時它正在工作。 – user2817749

+1

就像我對答案所作的改變一樣? –

+0

我很難相信這對性能有任何影響。我認爲MySQL只是從一種語法轉換爲另一種語法。 – Barmar

相關問題