MySQL之in與exists
mysql最佳化器對in語句的最佳化是“LAZY”的,對於in,如果不是顯示的列表定義,如in('a','b','c'),那麼in語句都會被轉換為exists相關子查詢。如下面獨立子查詢:
select ...from t1 where t1.a in (selelct b from t2);
最佳化器會將語句重寫為如下相關子查詢:
select ...from t1 where exists (select 1 from t2 where t2.b = t1.a)
如果t1,t2分別返回m、n行,那麼該查詢掃描為o(n+m*n)次,首先,exists需要掃描n次,然後相關查詢是m*n次維度的。
所以,我們不要花費精力去想到底是用in還是exists,因為mysql最佳化器會自動轉換,我們應該花時間來降低表的邏輯IO
怎樣降低掃描次數?在不能改變t1的返回結果時,只能考慮最佳化子查詢了了。
譬如1:子查詢中如果有group by操作,那麼每一次關聯外部查詢,都會進行一次group by,共進行n次group by操作,
所以可以考慮在相關子查詢外面再巢狀一層子查詢,做成靜態的,這樣就不用每次關聯查詢都去group by了。
2,對子查詢建立索引,也能減少邏輯IO
3,可以使用派生表(臨時表)重寫子查詢,進行表連線,以避免子查詢與外部查詢進行多次比較。
select ...from t1 where t1.a in (selelct b from t2);
最佳化器會將語句重寫為如下相關子查詢:
select ...from t1 where exists (select 1 from t2 where t2.b = t1.a)
如果t1,t2分別返回m、n行,那麼該查詢掃描為o(n+m*n)次,首先,exists需要掃描n次,然後相關查詢是m*n次維度的。
所以,我們不要花費精力去想到底是用in還是exists,因為mysql最佳化器會自動轉換,我們應該花時間來降低表的邏輯IO
怎樣降低掃描次數?在不能改變t1的返回結果時,只能考慮最佳化子查詢了了。
譬如1:子查詢中如果有group by操作,那麼每一次關聯外部查詢,都會進行一次group by,共進行n次group by操作,
所以可以考慮在相關子查詢外面再巢狀一層子查詢,做成靜態的,這樣就不用每次關聯查詢都去group by了。
2,對子查詢建立索引,也能減少邏輯IO
3,可以使用派生表(臨時表)重寫子查詢,進行表連線,以避免子查詢與外部查詢進行多次比較。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28912557/viewspace-1173059/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL exists 優化 in 效率MySql優化
- mysql 關於exists 和in分析MySql
- MySQL 5.7 NOT EXISTS用法介紹MySql
- exists和not exists及in和not in的用法與區別
- elasticsearch之exists查詢Elasticsearch
- [精選] SQL中的IN與NOT IN、EXISTS與NOT EXISTS的區別及效能分析SQL
- MySQL過程慎用if not exists寫法MySql
- PHP審計之class_exists與任意例項化漏洞PHP
- NOT IN 與NOT EXISTS的區別何在?
- oracle in與exists 的區別Oracle
- IN&EXISTS與NOT IN&NOT EXISTS 的優化原則的討論優化
- in,exists和not exists ,not in與null的一些關係記載Null
- 【MySQL】NOT EXISTS優化的一個案例MySql優化
- MySQL過程真要慎用if not exists寫法MySql
- 對線面試官:SQL中的IN與NOT IN、EXISTS與NOT EXISTS的區別及效能分析面試SQL
- 詳解not in與not exists的區別與用法
- [Oracle] exists 和 not existsOracle
- exists與in子查詢優化優化
- EXISTS、IN、NOT EXISTS、NOT IN用法區別
- 大神級回答exists與in的區別
- [not] in/exists 與 帶TOP的子查詢
- MYSQL 中 exists 語句執行效率變低MySql
- 對IN & EXISTS NOT IN & NOT EXISTS的優化優化
- EXISTS、IN、NOT EXISTS、NOT IN的區別(ZT)
- in/exists和not in/not exists執行效率
- mysql之鎖與事務MySql
- mysql探究之null與not nullMySqlNull
- sql:delete if exists還是drop if exists?SQLdelete
- in、exists操作與null的一點總結Null
- oracle sql_not exists與null的測試OracleSQLNull
- MySQL防止重複插入相同記錄 insert if not existsMySql
- oracle中關於in和exists,not in 和 not existsOracle
- 【SQL】existsSQL
- 關於ORACLE MYSQL NOT IN和NOT exists需要注意的 NULL值OracleMySqlNull
- mysql 左連線,右連線,內連結,exists等MySql
- oracle中的exists 和not exists 用法詳解Oracle
- SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差別SQL
- In和exists使用及效能分析(二):exists的使用