Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试使用子查询优化简单的SQL update语句_Sql_Mysql - Fatal编程技术网

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

尝试使用子查询优化简单的SQL update语句,sql,mysql,Sql,Mysql,此查询非常慢,每条记录大约需要1秒的时间。可悲的是,由于数据库的大小,这是站不住脚的,因为它需要几天才能完成 你能提出一个大大加快速度的方法吗?(我只需要运行一次,但在中,您需要确保tasks.participant\u id.上有一个索引,这取决于每个参与者的任务数量(如果确实有很多)您还可以在时间戳上添加索引,尽管我不知道MySQL是否会使用它。您需要确保tasks.participant\u id上有索引。这取决于每个参与者的任务数量(如果确实有很多)您还可以在时间戳上添加索引,尽管我不知

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


你能提出一个大大加快速度的方法吗?(我只需要运行一次,但在中,您需要确保tasks.participant\u id.上有一个索引,这取决于每个参与者的任务数量(如果确实有很多)您还可以在时间戳上添加索引,尽管我不知道MySQL是否会使用它。

您需要确保tasks.participant\u id上有索引。这取决于每个参与者的任务数量(如果确实有很多)您还可以在时间戳上添加索引,尽管我不知道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服务器会自动删除临时表,因此根据应用程序的连接处理,您可能希望手动删除临时表。

您可以使用如下临时表:

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

有了正确的外键和索引设置,应该不会花那么长时间。

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

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

如果外键和索引设置正确,则不会花费太长时间。

该查询不会产生与OP相同的结果。每个参与者都有一个单独的开始时间。该查询不会产生与OP相同的结果。每个参与者都有一个单独的开始时间。Boom!一个索引!这是肯定的。是的,tasks.participant\u id字段没有索引。非常感谢!一个索引!肯定是这样。是的,tasks.participant\u id字段没有索引。非常感谢