某業務 SQL 使用子查詢執行 DELETE,耗時 31.74 秒;改為 SELECT 後僅需 0 秒。經分析,子查詢導致優化器選擇全表掃描 (type=ALL),掃描 571 萬行;而 SELECT 版本則走主鍵等值查詢 (type=eq_ref),僅掃描 1 行並避免回表。
DELETE FROM trade_info
WHERE id IN (
SELECT id FROM (
SELECT a.id
FROM trade_info a
JOIN order_info b ON a.order_id = b.id
JOIN user c ON b.buyer = c.id
WHERE c.itv_account = '90000248'
) temp
);
MySQL 支援多表 DELETE 語法:DELETE t1 FROM t1 JOIN t2 ON ... WHERE ...。將子查詢轉換為衍生表並 JOIN 回主表:
DELETE trade_info
FROM trade_info
JOIN (
SELECT a.id
FROM trade_info a
JOIN order_info b ON a.order_id = b.id
JOIN user c ON b.buyer = c.id
WHERE c.itv_account = '90000248'
) t2 ON trade_info.id = t2.id;
此案例證明:將相關子查詢轉換為多表 JOIN DELETE,能讓優化器選擇更優執行計畫,實現數量級效能提升。