您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Mysql中怎么進行優化器對子查詢的處理,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
根據子查詢的類型和位置不同,mysql優化器會對查詢語句中的子查詢采取不同的處理策略,其中包括改寫為連接(join),改寫為半連接(semi-join)及進行物化處理等。
標量子查詢(Scalar Subquery):查詢語句中的標量子查詢每次只返回一行數據,執行期間優化器能將其優化掉并對其進行緩沖處理。
IN子查詢(唯一)(IN Subquery(Unique)):查詢語句中的子查詢返回唯一數據集,因此,優化器可以將這種子查詢安全的轉換為內連接(inner join)進行處理。explain后執行show warnings應該可以看到這種場景的發生。
IN子查詢(非唯一)(IN Subquery(Non-Unique)):當查詢語句中的子查詢返回非唯一數據集時,此時,優化器并不能將子查詢安全的轉換為內連接,而只能采取其他的處理策略,例如:將子查詢轉換為半連接(Semi-join),而mysql中,執行半連接的策略包括FirstMatch,Materializelookup,Materializescan,DuplicatesWeedout,Loosescan等,每種策略的具體處理細節,大家可以參考相應文檔,此處不再贅述。
NOT IN子查詢(NOT IN子查詢):針對查詢語句中的NOT IN子查詢,mysql優化器可以采取物化處理和轉化為exists兩種策略。
驅動表(Derived Table):針對查詢語句from子句中的子查詢,mysql優化器并不會對其進行物化處理。而是通常對其進行合并處理(merge),其類似于視圖將其定義與查詢語句的謂詞合并的方法。
CTEs和視圖(CTEs and Views):視圖作為存儲的查詢,可以簡化應用,也可以實現數據安全,而CTEs與視圖類似,只是其生命期僅僅局限于相關查詢語句本身。mysql優化器對CTEs和視圖的處理,主要有兩種策略,那就是合并處理(Merge)和物化處理(Materialize),針對CTEs和視圖,mysql優化器首先嘗試對其進行與主查詢的合并,當某些場景導致其不能與住查詢合并時,才會考慮通過將視圖或CTEs結果通過臨時表進行固化,以供主查詢其他部分進行查詢使用。這點explain后show warings可以看到這些場景的出現。
以上就是Mysql中怎么進行優化器對子查詢的處理,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。