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中优化上述查询的最佳方法是什么。
答案 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(停产期)停产有关。