MYSQL-DELETE優化


問題現象:采用子查詢的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM