萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 多表關聯 UPDATE 寫法全解析:JOIN vs 子查詢效能大比拚

單表 UPDATE 回顧

UPDATE table_name SET col1 = xx, col2 = yy WHERE col = zz;

核心在於 WHERE 條件精準鎖定目標列。

跨表更新需求場景

例:依據 table_2 中 sid=10 的 uid,將 table_1 對應行的 score 加 5。

寫法一:子查詢

UPDATE table_1 
SET score = score + 5 
WHERE uid IN (SELECT uid FROM table_2 WHERE sid = 10);
  • 直觀易懂,但 MySQL 優化器對 IN (SELECT...) 處理較弱,大資料量易退化為全表掃描。

寫法二:INNER JOIN(推薦)

UPDATE table_1 t1
INNER JOIN table_2 t2 ON t1.uid = t2.uid
SET t1.score = t1.score + 5
WHERE t2.sid = 10;
  • 利用 JOIN 機制,優化器可選擇最佳驅動表並使用索引,效能通常優於子查詢。
  • 支援 LEFT JOIN 需求(如:無論是否匹配皆更新,未匹配設預設值)。

標準多表 UPDATE 語法

UPDATE Track
INNER JOIN MV ON Track.trkid = MV.mvid
SET Track.is_show = MV.is_show
WHERE Track.trkid < 6;

舊式逗號語法(等效但不推薦)

UPDATE Track, MV
SET Track.is_show = MV.is_show
WHERE Track.trkid = MV.mvid AND Track.trkid < 6;

ANSI SQL-92 標準建議使用明確 JOIN 語法,可讀性與維護性更佳。

進階技巧與注意事項

  • 別名簡化:複雜查詢務必給表起別名(t1, t2),避免欄位歧義。
  • 多表同步更新:SET t1.col = t2.col, t2.flag = 1 可同時更新多張表欄位。
  • 事務包裹:重要業務務必用 START TRANSACTION; ... COMMIT; 確保原子性。
  • 索引覆蓋:JOIN 條件欄位(ON 後)與 WHERE 篩選欄位務必建立索引。
  • 避免鎖升級:大批次更新建議分批(如每 1000 行),減少鎖持有時間與複製延遲。

效能對比實測建議

場景推薦寫法理由
小資料量(<1萬行)子查詢或 JOIN 均可差異微乎其微,優先可讀性
大資料量、高併發INNER JOIN優化器支援更好,易用到索引
需保留左表所有行LEFT JOIN子查詢難以表達「無匹配也更新」
更新條件極其複雜CTE (WITH) + JOINMySQL 8.0+ 支援,邏輯清晰

總結

多表 UPDATE 首選 INNER JOIN 語法,兼具效能與可讀性。理解 JOIN 類型差異(INNER/LEFT/RIGHT)並善用索引,是寫出高效 SQL 的關鍵。

copyright © 萬盛學電腦網 all rights reserved