尝试使用子查询优化简单的SQL更新语句

时间:2010-09-20 10:48:20

标签: sql mysql

此查询非常慢,每条记录大约需要1秒。遗憾的是,由于数据库的大小(并且因为它),这是站不住脚的,因为它需要数天才能完成。

你能建议一种大幅加速的方法吗? (我只需要运行一次,但理想情况下在<1hr窗口中)

update participants set start_time = (select min(time_stamp)
from tasks where participant_id = participants.participant_id)

我认为我们不需要完整的表格描述来建议更合理的查询结构,但如果需要我可以发布它们。数据库是mysql。

非常感谢。

3 个答案:

答案 0 :(得分:1)

您需要确保在tasks.participant_id上有索引。根据每个参与者的任务数量(如果真的很多),您还可以在time_stamp上添加索引,但我不知道MySQL是否会使用它。

答案 1 :(得分:0)

您可以使用这样的临时表来执行此操作:

create temporary table temp 
select id as participant_id, min(time_stamp) as start_time 
from participants inner join tasks on participants.participant_id = tasks.participant_id 
group by participant_id;

update participants, temp 
set start_time = temp.start_time 
where participants.participant_id = temp.participant_id;

这会将相关子查询替换为更快的连接。

当MySQL与客户端的连接关闭时,MySQL服务器会自动删除临时表,因此根据应用程序的连接处理情况,您可能需要手动删除它。

答案 2 :(得分:0)

我认为,你不需要内部选择

update participants set start_time = min(time_stamp)

校正:

update participants 
set start_time = min(tasks.time_stamp)
from participants inner join 
tasks on participants.participant_id = tasks.participant_id

并且使用正确的外键和索引设置不应该花这么长时间。