[英]How to handle long complex SQL update query?
我有這個永遠不會完成執行的代碼。
這是發生的事情:
問題是使其可擴展,即使在 10 億行更新中,它也可以工作
<?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.