2017-04-05 72 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

相关问题