問題現象:采用子查詢的DELETE執行得非常慢,改寫成SELECT后執行卻很快,最后把這個子查詢DELETE改寫成JOIN優化過程
1.問題描述:
采用子查詢的DELETE執行語句,執行效率非常慢;但把DELETE換成SELECT后,執行秒出結果,這是何故?遂查看執行計划:
可以看下執行計划,看下type類型:ALL應該是全表掃描,rows為幾千萬的話,所以執行效率很慢
改成SELECT后,執行計划如下變為:type=ref 基於主鍵的等值查詢,rows為幾百條,所以節省很多效率;
2.優化思路:
既然這個SQL把DELETE改成SELECT后執行效率就可以獲得很大提升,除此外沒特別區別,可能是查詢優化器方面有些不足,導致無法直接優化,就得另想辦法了。我們的思路是把基於子查詢的DELETE簡化改寫成多表JOIN后DELETE(一般來說,子查詢效率比較低的話,可以考慮改寫成JOIN),多表DELETE的語法課參考:https://dev.mysql.com/doc/refman/5.7/en/delete.html#idm140469624466800,例如這樣的:
DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL