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,举例: