simple
查詢語句中不包含UNION
或者子查詢的查詢都算作是SIMPLE
類型,無論是單表查詢還是聯合查詢這些查詢的級別都是 simple。顧名思義,這些查詢都被 MySQL 認為是比較簡單的查詢模式。
單表查詢:
連接查詢:
使用子查詢:
這里需要說明的一點是,其實子查詢嚴格意義上不是 simple 級別的,但是我這里舉得這個例子比較特殊,原理是因為這個 SQL 在MySQL 的查詢優化器上被優化成了連接查詢,所以才會出現這種情況。換句話說,這個 SQL 最終執行的內容和上面的這個 SQL 是一種類型。
primary
對於包含UNION、UNION ALL或者子查詢的大查詢來說,它是由幾個小查詢組成的,其中最左邊的那個查詢的select_type值就是PRIMARY
比如說:
union
接着上面的說,包含UNION、UNION ALL或者子查詢的大查詢來說,它是由幾個小查詢組成的嘛。除了第一個是 PRIMARY,其他的都是 UNION
UNION RESULT
還是接着上面說,如果 MySQL 中的 UNION 需要用到臨時表進行去重的話,那么這個小查詢的級別就是 UNION RESULT
SUBQUERY
如果我們的子查詢不能轉換對應 semi-join的形式,而且這個查詢不是相關子查詢的話,並且查詢優化器決定采用將該子查詢物化的方案來執行該子查詢時,這個時候該子查詢的第一個 SELECT 的級別就是 SUBQUERY
DEPENDENT SUBQUERY
如果包含子查詢的查詢語句不能夠轉為對應的semi-join的形式,並且該子查詢是相關子查詢,則該子查詢的第一個SELECT關鍵字代表的那個查詢的select_type就是DEPENDENT SUBQUERY
DEPENDENT UNION
在包含UNION或者UNION ALL的大查詢中,如果各個小查詢都依賴於外層查詢的話,那除了最左邊的那個小查詢之外,其余的小查詢的select_type的值就是DEPENDENT UNION
該隨筆為學習筆記,內容源自《MySQL 是怎樣運行的:從根兒上理解 MySQL》