MySQL中in(獨立子查詢)的執行計劃

541732025發表於2015-03-02

在之前有一篇文章講了in(常量列表)的執行計劃,詳見連結:http://blog.itpub.net/28912557/viewspace-1255568/
那麼對於對於in(獨立子查詢),MYSQL會怎麼執行呢?其實,現代mysql最佳化器都會將in獨立子查詢語句轉換為exists相關子查詢。

所以有些人發現在MYSQl中測試發現in與exists效能差不多,就是這個原因。因此我們就不必糾結是選擇in還是exists了,大部分情況下,其實都一樣。

但是這裡有一個問題,假如外部查詢、子查詢分別有M、N條記錄,那麼整個查詢會進行O(M+M*N)次掃描,意味著邏輯IO大大增加。(M為外部表查詢掃描次數,M*N為exists相關子查詢掃描次數)。

為了減少邏輯IO,可以對相關子查詢進行最佳化,譬如:

1,對子查詢建立索引,這是顯而易見的。

2,假如子查詢中有group by操作,每一次關聯外部查詢都會進行group by,可以考慮在子查詢外面再巢狀一層子查詢,做成靜態的,減少邏輯IO。

3,使用派生表重寫子查詢,進行表連線。

總之,按需求來最佳化。

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

相關文章