一 簡介:今天咱們來聊聊explain的select_type
二 類型
(1)SIMPLE
簡單的SELECT語句(不包括UNION操作或子查詢操作)
(2)PRIMARY/UNION
PRIMARY:查詢中最外層的SELECT(如兩表做UNION或者存在子查詢的外層的表操作為PRIMARY,內層的操作為UNION)
UNION:UNION操作中,查詢中處於內層的SELECT(內層的SELECT語句與外層的SELECT語句沒有依賴關系)
(3)DEPENDENT UNION/UNIOIN RESULT
DEPENDENT UNION:UNION操作中,查詢中處於內層的SELECT(內層的SELECT語句與外層的SELECT語句有依賴關系)
UNION RESULT:UNION操作的結果,id值通常為NULL
例子
select * from people where zipcode=10000 union select * from people where zipcode=1000
(4)SUBQUERY/DEPENDENT SUBQUERY
SUBQUERY:子查詢中首個SELECT(如果有多個子查詢存在):
DEPENDENT SUBQUERY:子查詢中首個SELECT,但依賴於外層的表(如果有多個子查詢存在)
重點解釋 子查詢的查詢方式依賴於外面的查詢結果.用這個例子就是,先進行子查詢外部的查詢,得到一個結果集,.然后這個結果的每一行在跟select子查詢的結果集進行匹配,也就是說,外部結果集的每一行都要關聯內部結果集一次
(5)DERIVED/MATERIALIZED
DERIVED:被驅動的SELECT子查詢(子查詢位於FROM子句)
例子
select aa from (select * from a) b;
MATERIALIZED:被物化的子查詢
(6)UNCACHEABLE SUBQUERY/UNCACHEABLE UNION
UNCACHEABLE SUBQUERY:對於外層的主表,子查詢不可被物化,每次都需要計算(耗時操作)
UNCACHEABLE UNION:UNION操作中,內層的不可被物化的子查詢(類似於UNCACHEABLE SUBQUERY)
三 注意
特別關注 DEPENDENT SUBQUERY
1 會嚴重消耗性能
2 不會進行子查詢,會先進行外部查詢,生成結果集,再在內部進行關聯查詢
3 子查詢的執行效率受制於外層查詢的記錄數
4 可以嘗試改成join查詢