MySQL-optimizeupdate语句

MySQL-optimizeupdate语句,mysql,sql,query-optimization,Mysql,Sql,Query Optimization,我正在尝试基于联接更新表中的列。但是mysql将进入锁定等待超时。无法更改my.ini或设置全局超时。我使用的是5.0.80版本,因此无法进行解释 cars\u lookup=200000行 轮数=50k行 在MYSQL中优化上述查询的最佳方法是什么。对于此查询: update CARS_LOOKUP INNER JOIN wheels_log ON CARS_LOOKUP.NoOfWheels= wheels_log.NoOfWheels set CARS_LOOKUP.model=

我正在尝试基于联接更新表中的列。但是mysql将进入锁定等待超时。无法更改my.ini或设置全局超时。我使用的是5.0.80版本,因此无法进行解释

cars\u lookup=200000行

轮数=50k行

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

对于此查询:

update CARS_LOOKUP
    INNER JOIN wheels_log ON CARS_LOOKUP.NoOfWheels= wheels_log.NoOfWheels
set CARS_LOOKUP.model= wheels_log.model
您需要在
车轮日志(无车轮,型号)
上建立索引

也就是说,我不明白为什么你的版本会超时,除非你的表真的很大。一种可能性是,
wheels\u log
实际上有许多行具有相同的
NoOfWheels
。您可以通过以下方式进行检查:

update CARS_LOOKUP c join
       wheels_log w
       on c.NoOfWheels = w.NoOfWheels
    set c.model= w.model;
如果存在这样的重复,它们可能会对性能产生很大影响。您需要决定想要哪种型号。

计划A:

如果这是一次性任务:

select NoOfWheels, count(*)
from wheels_log
group by NoOfWheels
having count(*) > 1;
方案B:

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

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

一次浏览
CARS\u LOOKUP
1000行。更多细节

D计划:

嗯,你真的需要考虑一下。很难再找到人为福特T型车服务了


升级5.0->5.1->5.5->5.6->5.7->8.0——你有几个版本已经过时了!实际上,5.0.80只有9岁。但那可能是5.0版(寿命结束)的下线发生的时间。

我使用的是5.0.80版,所以无法解释
Eh?-这就是说,在两个表中的noofwheels上都有一个索引似乎很有用。是的,戈登,有重复的。我在两个表的noofwheels上都添加了一个索引…但查询仍将进入等待超时…我是否可以用其他方法编写查询以获得相同的结果?@Oggu-不是
索引(noofwheels)
,一个复合
索引(noofwheels,model)
;这可能会产生显著的不同。
SHOW VARIABLES;
SHOW GLOBAL STATUS;
how much RAM?