[PHP][MYSQL] PHP+MySQL 批量更新百萬級資料的最佳策略
在處理數十萬甚至數百萬筆資料的更新任務時,許多開發者習慣使用迴圈執行單條 UPDATE 語句。但當資料量過大時,這種做法會導致應用程式卡死、資料庫負載飆升,效率極低。 本文將介紹一種資料庫專業人士常用的高效解決方案: 使用 UPDATE JOIN 搭配臨時表(Temporary Table) 。 🎯 什麼是批量更新的「效能殺手」? 當您使用 PHP 迴圈執行 10 萬次 UPDATE ... WHERE id = X 時,主要的效能瓶頸並不是資料庫處理本身,而是: 網絡傳輸延遲: 10 萬次 PHP 應用伺服器與 MySQL 伺服器之間的通訊。 SQL 解析開銷: MySQL 必須解析、驗證和優化 10 萬次 SQL 語句。 磁碟 I/O 寫入: 缺乏事務(Transaction)保護下,每一次更新都可能觸發一次昂貴的磁碟日誌寫入。 我們的目標是將這 10 萬次操作,轉換為 一次高效、單一的資料庫操作 。 💡 最佳策略:UPDATE JOIN + 臨時表 這個策略的核心思路是: 收集新值: 將所有需要更新的新資料(例如 uid 和 name )組裝起來。 快速載入: 將這些新值一次性快速載入到一個輕量級的 臨時表 中。 單次執行: 執行一個高效的 UPDATE JOIN 語句,讓資料庫在內部利用索引完成所有幾十萬筆資料的更新。 適用情境 異質更新: 每筆資料要更新的目標值都不同(例如:客戶 A 積分變 100,客戶 B 積分變 200)。 非唯一鍵更新: 主表中的關聯鍵(如您的 uid )可能 重複 。 🛠️ 實戰教學:三步驟完成百萬級更新 假設我們有一個名為 performance_records 的業績表, uid 欄位會重複,我們需要根據新的清單來更新所有匹配的 name 欄位。 步驟 1:建立並填充臨時表 (使用 PHP 批量 INSERT) 我們首先建立一個臨時表 temp_name_updates ,並將幾十萬筆新資料高效地寫入。 關鍵優化: 在臨時表上建立 主鍵 ( PRIMARY KEY ) ,這能極大地加速稍後的 JOIN 關聯速度。 // 假設 $pdo...