首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL JOIN 優化:子查詢改寫 LEFT JOIN,避免臨時表提升效能

     編輯:MySQL 資料庫相關知識

子查詢 vs JOIN 效能差距

MySQL 4.1+ 支援子查詢,邏輯清晰但需建立臨時表執行,效能較差。

實戰改寫:NOT IN 子查詢 → LEFT JOIN ... IS NULL


-- 子查詢版(建立臨時表)
SELECT * FROM customerinfo
WHERE CustomerID NOT IN (SELECT CustomerID FROM salesinfo);

-- JOIN 版(無臨時表,salesinfo.CustomerID 有索引時極快)
SELECT * FROM customerinfo
LEFT JOIN salesinfo ON customerinfo.CustomerID = salesinfo.CustomerID
WHERE salesinfo.CustomerID IS NULL;

核心原理

  • JOIN 由單一查詢計畫完成,無需臨時表中繼。
  • 被驅動表(salesinfo)於連接欄位有索引時,ref 存取極高效。
  • 子查詢在舊版本甚至無法使用索引,新版本雖有優化但仍不如 JOIN 穩定。

避坑提醒

  • LEFT JOIN 條件欄位必須有索引,否則退化為全表掃描。
  • 若子查詢返回極少行且外層表極大,EXISTS 可能優於 JOIN,需實測 EXPLAIN 對比。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved