【MySQL】NOT EXISTS優化的一個案例
一、原始語句:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一個MySQL優化案例的初步思路MySql優化
- MySQL exists 優化 in 效率MySql優化
- 對IN & EXISTS NOT IN & NOT EXISTS的優化優化
- MySQL SQL優化案例(一)MySql優化
- 一個效能優化的案例優化
- 【案例】MySQL count操作優化案例一則MySql優化
- 一個NOT EXISTS含有OR條件子查詢的優化優化
- 記一個SQL優化案例SQL優化
- 一個複合索引的優化案例索引優化
- oracle之優化一用group by或exists優化distinctOracle優化
- Oracle優化案例-用left join代替反連線 not in not exists(十)Oracle優化
- IN&EXISTS與NOT IN&NOT EXISTS 的優化原則的討論優化
- Oracle效能優化-SQL優化(案例一)Oracle優化SQL
- MYSQL 阿里的一個sql優化問題MySql阿里優化
- MySQL案例05:CPU負載優化MySql負載優化
- MySQL:一個奇怪的hang案例MySql
- exists與in子查詢優化優化
- 一次成功的優化案例優化
- IO優化案例一則優化
- mysql優化(一)MySql優化
- Mysql優化原則_小表驅動大表IN和EXISTS的合理利用MySql優化
- Kettle Table Exists控制元件優化控制元件優化
- php mysql 一個查詢優化的簡單例子PHPMySql優化單例
- MySQL union的一種優化MySql優化
- 優化MySQL的21個建議優化MySql
- Mysql效能優化一MySql優化
- Mysql索引優化(一)MySql索引優化
- MySQL 調優/優化的 100 個建議MySql優化
- 效能優化案例-SQL優化優化SQL
- 一個sql的優化SQL優化
- 記一次前端效能優化的案例前端優化
- Laravel的unique和exists驗證規則的優化Laravel優化
- MySQL:Innodb 一個死鎖案例MySql
- MySQL效能優化的5個維度MySql優化
- MySQL幾個簡單SQL的優化MySql優化
- 專題《一》 mysql優化MySql優化
- Mysql高階優化(一)MySql優化
- 一次生產的 JVM 優化案例JVM優化