mysql-optimize更新语句

lbsnaicq  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(381)
update CARS_LOOKUP
    INNER JOIN wheels_log ON CARS_LOOKUP.NoOfWheels= wheels_log.NoOfWheels
set CARS_LOOKUP.model= wheels_log.model

我正在尝试基于联接更新表中的列。但是mysql将进入锁定等待超时。无法更改my.ini或设置全局超时。我在5.0.80版本,所以不能做解释
车辆查找=20万行,
车轮日志=5万行
在mysql中优化上述查询的最佳方法是什么。

798qvoo8

798qvoo81#

方案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 一次一千排。更多细节在这里。
方案d:
你真的需要好好想想。很难再找到一个能为福特t型车服务的人了。
升级5.0->5.1->5.5->5.6->5.7->8.0——你的几个版本已经过时了!实际上,5.0.80才9岁。但那可能是5.0(寿命结束)的eol发生的时间。

xcitsw88

xcitsw882#

对于此查询:

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;

如果存在这样的重复项,它们可能会对性能产生很大影响。你需要决定你想要哪种型号。

相关问题