MySQL-optimizeupdate语句
我正在尝试基于联接更新表中的列。但是mysql将进入锁定等待超时。无法更改my.ini或设置全局超时。我使用的是5.0.80版本,因此无法进行解释 cars\u lookup=200000行 轮数=50k行 在MYSQL中优化上述查询的最佳方法是什么。对于此查询: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=
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?