schedual定時任務執行報錯 explain執行計劃詳解( 二 )

2. PRIMARY
對于包含 union 或者子查詢的大查詢來說,它是由幾個小查詢組成的,其中最左邊的那個查詢的 select_type 值就是 PRIMARY,比如:
mysql> explain select * from t1 union select * from t2; ---- -------------- ------------ ------------ ------ --------------- ------ --------- ------ ------ ---------- ----------------- | id | select_type| table| partitions | type | possible_keys | key| key_len | ref| rows | filtered | Extra| ---- -------------- ------------ ------------ ------ --------------- ------ --------- ------ ------ ---------- ----------------- |1 | PRIMARY| t1| NULL| ALL| NULL| NULL | NULL| NULL | 1000 |100.00 | NULL||2 | UNION| t2| NULL| ALL| NULL| NULL | NULL| NULL |1 |100.00 | NULL|| NULL | UNION RESULT | | NULL| ALL| NULL| NULL | NULL| NULL | NULL |NULL | Using temporary | ---- -------------- ------------ ------------ ------ --------------- ------ --------- ------ ------ ---------- ----------------- 3. UNION
位于 union 或者 union all 查詢中第二個及其以后的查詢被標記為 UNION,第一個被標記為 primary ,可以對比上一個例子的效果 。
4. UNION RESULT
MySQL 選擇使用臨時表來完成 UNION 查詢的去重工作,針對該臨時表的查詢的 select_type 就是 UNION RESULT,跟上一個例子一樣 。
5. SUBQUERY
當子查詢不能被優化成 semi-join,但可以用 materialization 來優化,顯示為 SUBQUERY,表示這是一個不相關子查詢,子查詢只需要執行一遍(因為結果被物化成臨時表了),舉例:
mysql> SELECT * FROM t1 WHERE t1.a IN (SELECT t2.b FROM t2 WHERE id < 10); ---- ------------- ------- ------- --------- ------ ------ ------------- | id | select_type | table | type| key| ref| rows | Extra| ---- ------------- ------- ------- --------- ------ ------ ------------- |1 | PRIMARY| t1| ALL| NULL| NULL |100 | Using where ||2 | SUBQUERY| t2| range | PRIMARY | NULL |9 | Using where | ---- ------------- ------- ------- --------- ------ ------ ------------- 6. DEPENDENT SUBQUERY
當子查詢不能被優化成 semi-join,并且是一個相關子查詢(或者非相關子查詢關閉 materialization 優化策略時),會被優化器轉化成 exists 相關子查詢來進行查詢,顯示為 DEPENDENT SUBQUERY,表示這是一個相關子查詢,會根據外查詢結果執行多次 。舉例:
mysql> SELECT * FROM t1 WHERE t1.a IN (SELECT t2.b FROM t2 WHERE id < 10); ---- -------------------- ------- ------- --------- ------ ---------- ------------- | id | select_type| table | type| key| rows | filtered | Extra| ---- -------------------- ------- ------- --------- ------ ---------- ------------- |1 | PRIMARY| t1| ALL| NULL|100 |100.00 | Using where ||2 | DEPENDENT SUBQUERY | t2| range | PRIMARY |9 |10.00 | Using where | ---- -------------------- ------- ------- --------- ------ ---------- ------------- 7. MATERIALIZED
當子查詢被優化成 semi-join 執行,并且 semi-join 用的是 Materialize 策略,這個子查詢對應顯示就是 MATERIALIZED,然后用子查詢結果物化后的臨時表與另一張表進行關聯查詢 。舉例:
mysql> SELECT * FROM t1 WHERE t1.a IN (SELECT t2.b FROM t2 WHERE id < 10); ---- -------------- ------------- ------- --------- --------------- ------ ------------- | id | select_type| table| type| key| ref| rows | Extra| ---- -------------- ------------- ------- --------- --------------- ------ ------------- |1 | SIMPLE|| ALL| NULL| NULL| NULL | Using where ||1 | SIMPLE| t1| ref| a| .b |1 | NULL||2 | MATERIALIZED | t2| range | PRIMARY | NULL|9 | Using where | ---- -------------- ------------- ------- --------- --------------- ------ ------------- 8. DERIVED
對于無法使用 derived_merge 優化的派生子查詢,優化器會采用物化的方式執行的包含派生表的子查詢,該派生表對應的子查詢的 select_type 就是 DERIVED,舉例:

推薦閱讀