【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 SQL優化案例(一)MySql優化
- Oracle優化案例-用left join代替反連線 not in not exists(十)Oracle優化
- oracle之優化一用group by或exists優化distinctOracle優化
- exists與in子查詢優化優化
- Oracle效能優化-SQL優化(案例一)Oracle優化SQL
- MySQL案例05:CPU負載優化MySql負載優化
- MySQL:一個奇怪的hang案例MySql
- mysql優化(一)MySql優化
- Laravel的unique和exists驗證規則的優化Laravel優化
- Mysql索引優化(一)MySql索引優化
- Mysql效能優化一MySql優化
- MySQL:Innodb 一個死鎖案例MySql
- MySQL效能優化的5個維度MySql優化
- 專題《一》 mysql優化MySql優化
- Mysql高階優化(一)MySql優化
- 一次生產的 JVM 優化案例JVM優化
- MySQL 優化一(高階篇)MySql優化
- Oracle 某行系統SQL優化案例(一)OracleSQL優化
- 一份平民化的MySQL效能優化指南MySql優化
- Oracle效能優化-SQL優化(案例二)Oracle優化SQL
- Oracle效能優化-SQL優化(案例三)Oracle優化SQL
- Oracle效能優化-SQL優化(案例四)Oracle優化SQL
- MySQL優化(1)——–常用的優化步驟MySql優化
- mysql 關於exists 和in分析MySql
- mysql優化MySql優化
- Mysql 優化MySql優化
- MySQL之SQL優化詳解(一)MySql優化
- Oracle優化案例-使用with as優化Subquery Unnesting(七)Oracle優化
- SQL優化案例-使用with as優化Subquery Unnesting(七)SQL優化
- 將一個介面響應時間從2s優化到 200ms以內的一個案例優化
- PostgreSQL一複合查詢SQL優化例子-(多個exists,範圍檢索,IN檢索,模糊檢索組合)SQL優化
- MySQL架構的優化MySql架構優化
- mysql常用的優化操作MySql優化
- MySQL 的查詢優化MySql優化
- 關於mysql的優化MySql優化
- 白日夢的Elasticsearch實戰筆記,32個查詢案例、15個聚合案例、7個查詢優化技巧。Elasticsearch筆記優化
- Oracle優化案例-單表分頁語句的優化(八)Oracle優化
- SQL優化案例-單表分頁語句的優化(八)SQL優化