簡體   English   中英

如何處理長復雜的 SQL 更新查詢?

[英]How to handle long complex SQL update query?

我有這個永遠不會完成執行的代碼。

這是發生的事情:

  1. 我們調用 API 來獲取大數據,我們需要檢查與我們的數據庫是否有任何差異,我們需要為該特定行更新我們的數據庫。 行數將隨着項目的增長而增加,在某些情況下 go 甚至可能超過 10 億行。

問題是使其可擴展,即使在 10 億行更新中,它也可以工作

  1. 為了模擬它,我做了 9000 for 循環
<?PHP 
ini_set("memory_limit","-1");
 ignore_user_abort(true);
for ($i=0; $i < 9000; $i++) { 
  // Complex SQL UPDATE query that requires joining tables,
  // and doing search and update if matches several variables
}

//here I have log function to see if for loop has been finished

如果我循環它 10 次,它仍然需要時間,但它可以工作並記錄,但是 9000 它不會完成循環並且從不記錄任何內容。

注意:我添加了ini_set("memory_limit","-1"); ignore_user_abort(true); ini_set("memory_limit","-1"); ignore_user_abort(true); 以防止 memory 錯誤。

有沒有辦法讓這個可擴展?

詳細信息:我每天進行 2 次此查詢

在不知道 API 的細節、調用它的頻率、一次返回多少數據以及實際需要存儲多少信息的情況下,很難給出具體的答案。 不過,總的來說,我會這樣處理:

讓“生產者”腳本根據您的需要查詢 API,而不是進行復雜的 SQL 更新,讓它簡單地在本地存儲數據(大概在一個表中,我們稱之為tempTbl )。 這應該確保它運行相對較快。 在此表上實現某種時間戳,以便您知道何時插入記錄。 在理想情況下,下次運行此“生產者”腳本時,如果它遇到來自 API 中已存在於tempTbl中的任何數據,它將用新數據覆蓋它(並更新最后更新的時間戳)。 這確保tempTbl始終包含來自 API 的最新緩存更新。

您還將有一個“消費者”腳本,它定期運行並處理來自tempTbl的數據(大概按 LIFO 順序,但可以按您想要的任何順序)。 這個“消費者”腳本將處理來自tempTbl的 100 條記錄,對它們執行復雜的 SQL UPDATE 並從tempTbl中刪除它們。

這個想法是一個腳本(“生產者”)不斷地填充tempTbl ,而另一個腳本(“消費者”)不斷地處理該隊列中的項目。 大概是“消費者”比“生產者”快,否則tempTbl會變得太大。 但是通過智能模式,並仔細限制每個腳本的運行頻率,您有望保持停滯狀態。

我還假設這兩個腳本將作為 cron 作業運行,這意味着您只需要調整它們一次處理的記錄數以及它們的運行頻率。 從理論上講,“消費者”沒有理由不能簡單地處理所有未完成的記錄,盡管實際上這可能會給您的數據庫帶來過重的負擔,因此您可能希望將其限制為幾個(幾十個、幾百個、幾千個或百萬個? ) 一次記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM