簡體   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