【MySQL】NOT EXISTS優化的一個案例

TaihangMeng發表於2018-06-07

一、原始語句:

SELECT * FROM dcf_account.t_posting_transaction t1 WHERE NOT EXISTS ( SELECT * FROM dcf_loan.t_account_posting_detail t2 WHERE t1.track_no = t2.posting_num
     );
 

二、關於優化改語句的幾點思考:
    對於原始語句,因為是NOT EXISTS判斷,所以子查詢中沒有必要SELECT 只需SELECT ID甚至是SELECT 1都可以。另外,鑑於MySQL子查詢演算法效能較差,考慮改寫成對應的JOIN方式,因為這裡是NOT EXIST判斷,所以改寫時有一定技巧,即可使用左連線,然後過濾出未能成功連線的記錄。還有,原始語句最外層的查詢也是SELECT 至於這個是否有必要應當依據具體業務,儘量在滿足業務要求的條件下取儘可能少的欄位。最後,即時做了上述優化,若在連線條件上沒有合適的索引SQL效能仍然會非常差(特別是在表的資料量巨大的時候),所以考慮在連線的條件列t1.track_no 和 t2.posting_num上分別建立索引。


三、最終的優化結果如下
    語句由原來的進一個小時的執行時間減少到1秒內。

SELECT t1.id FROM dcf_account.t_posting_transaction t1 LEFT JOIN dcf_loan.t_account_posting_detail t2 ON t1.track_no = t2.posting_num WHERE t2.id IS NULL;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30776559/viewspace-2155774/,如需轉載,請註明出處,否則將追究法律責任。

相關文章