MySQL-优化更新语句

时间:2018-12-12 16:20:33

标签: mysql sql query-optimization

update CARS_LOOKUP
    INNER JOIN wheels_log ON CARS_LOOKUP.NoOfWheels= wheels_log.NoOfWheels
set CARS_LOOKUP.model= wheels_log.model

我正试图根据联接更新表中的列。但是mysql进入了一个锁wait_timeout。无法更改my.ini或设置全局超时。我使用的是5.0.80版本,因此无法进行解释

  

cars_lookup = 20万行,

     

wheels_log = 5万行

在MYSQL中优化上述查询的最佳方法是什么。

2 个答案:

答案 0 :(得分:0)

对于此查询:

update CARS_LOOKUP c join
       wheels_log w
       on c.NoOfWheels = w.NoOfWheels
    set c.model= w.model;

您要在wheels_log(NoOfWheels, model)上建立索引。

也就是说,除非您的表很大,否则我不明白为什么您的版本会超时。一种可能是wheels_log实际上有许多行具有相同的NoOfWheels。您可以将其检查为:

select NoOfWheels, count(*)
from wheels_log
group by NoOfWheels
having count(*) > 1;

如果存在此类重复项,则它们可能会对性能产生重大影响。您需要确定想要的模型中的哪个。

答案 1 :(得分:0)

计划A:

如果这是一项一次性任务:

SET SESSION innodb_lock_wait_timeout = 1200;   -- will 20 minutes suffice?
UPDATE ...;
SET SESSION innodb_lock_wait_timeout = 50;  -- back to default

计划B:

5.0在某些方面没有合理的默认值。提供这些以供进一步分析:

SHOW VARIABLES;
SHOW GLOBAL STATUS;
how much RAM?

计划C:

一次遍历CARS_LOOKUP一千行。更多详细信息here

D计划:

嗯,您确实需要对此进行思考。很难再找到人来为Model-T Ford服务。

升级5.0-> 5.1-> 5.5-> 5.6-> 5.7-> 8.0-您的版本已经过时了!好吧,实际上5.0.80才9岁。但这可能与5.0(停产期)停产有关。