繁体   English   中英

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

[英]Trying to optimise a simple SQL update statement with a subquery

该查询非常慢,每条记录大约花费1秒。 可悲的是,由于数据库的大小(并且由于数据库的大小),这是站不住脚的,因为要花几天的时间才能完成。

您能否提出一种大幅提高速度的方法? (我只需要运行一次,但最好在<1hr的窗口中运行)

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

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

非常感谢。

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

您可以使用如下临时表来执行此操作:

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服务器会自动删除临时表,因此您可能需要手动删除临时表,具体取决于应用程序的连接处理。

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

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

并使用正确的外键和索引设置,它不需要花费太长时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM